A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李挺 中级黑马   /  2013-2-20 21:56  /  1364 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李挺 于 2013-2-21 08:50 编辑
  1. class Day26 {
  2.         public String str="zhansan";
  3.         public void method1(){
  4.                 System.out.println("hello world!"+str);
  5.         }
  6.         class Inner{
  7.                 public void setA(String str){
  8.                         Day26.this.str=str;
  9.                         Day26.this.method1();
  10.                 }
  11.         }
  12.         public void method2(){
  13.                 Inner in=new Inner();
  14.                 in.setA("lisi");
  15.         }
  16.         public static void main(String[] args){
  17.                 Inner in=new Inner();
  18.                 in.setA("lisi");
  19.         }
  20. }
复制代码
这个 编译会报错说是:无法从静态上下文中引用非静态 变量this
这句话啥意思?


评分

参与人数 1黑马币 +9 收起 理由
李培根 + 9 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 柴乔军 于 2013-2-20 22:31 编辑

静态成员是优先与对象存在的,存在静态方法区中,此时还不明确该类是否有对象,是哪个对象
所以在静态方法中是不允许调用非静态的成员的

主函数是静态的,而你的内部类定义在成员位置,非静态,所以会报错

内部类改成静态的话,你内部类中的方法也需要修改

主函数这样改

Inner in = new Day26().new Inner();

你让主函数里建立一个外部类的对象在去建立内部类就可以了,这样对象就明确了,直接建立内部类,但是内部类
需要持有外部类对象的引用,不能被静态调用。这样改也就不需要改方法了

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
str是非静态变量 没有办法不创建对象就访问非静态变量
回复 使用道具 举报
非静态方法给静态变量赋值!是不行的。
Day26.this.str是静态变量。
public void setA(String str)非静态方法! 所以挂咯
回复 使用道具 举报
01.class Day26 {

02.        public static String str="zhansan";

03.        public static void method1(){

04.                System.out.println("hello world!"+str);

05.        }

06.        static class Inner{

07.                public void setA(String str){

08.                        Day26.str=str;       去掉this,因为静态方法中不能有this super 静态方法优先于对象存在

09.                        Day26.method1();

10.                }

11.        }

12.        public void method2(){

13.                Inner in=new Inner();

14.                in.setA("lisi");

15.        }

16.        public static void main(String[] args){

17.                Inner in=new Inner();

18.                in.setA("lisi");

19.        }

20.}因为主函数是静态的,静态方法只能访问静态成员和静态方法
回复 使用道具 举报
首先,main方法是静态的,只能访问静态变量和方法。
其次,Inner确切的说是Day26的成员内部类,就相当于Day26的一个非静态成员变量,main方法不能直接访问非静态成员。
如果要在main方法中创建Inner对象要这么做:
  1. public static void main(String[] args){

  2.                 //Inner in=new Inner();
  3.                 Day26.Inner in=new Day26().new Inner();
  4.                 //上句代码可以这么理解,要想生成内部类对象,首先要生成外部类对象
  5.                 in.setA("lisi");

  6.         }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马