为了账号安全,请及时绑定邮箱和手机立即绑定

急急急!为什么用HelloWorld.this.score是错误的?

我记得前面讲的静态方法中对静态变量的使用有两种方法:

第一种直接用(变量名);

第二种用(实例化一个对象;对象.变量名);

应该是类似的吧,我这里不就相当于第二种方法么?

正在回答

7 回答

只要类不是静态的 就有对象,有对象就有this

0 回复 有任何疑惑可以回复我~
#1

wswzh0329 提问者

非常感谢!
2015-10-06 回复 有任何疑惑可以回复我~

。。我现在知道this使用的前提是要有当前对象,然后也看了static的相关知识,静态在对象之前就存在,加载了一次,放在内存中;然后又产生了新的问题:

要调用内部类的普通方法,必须先创建内部类的对象没错吧?!--所以内部类中的成员是可以用this表示的?!

现在要用this调用外部类的成员,就要看外部类的对象是不是存在;针对这个问题,可以用创建内部类对象需不需要外部类对象来判断:

1.要是需要,说明有内类对象就肯定存在外类对象,就可以用this引用;

2.要是不需要,说明即使有内类对象也没有外部对象,也就不能用this引用;--到目前的逻辑应该没错吧?

接着就具体的判断:

1.成员内部类:明确的说了需要用外部类的对象来创建内部类的对象,所以能用this;

2.静态内部类:也是明确的说了不需要外部类的对象来创建内部类的对象,所以不能用this;

3.方法内部类:可以分为普通方法内部类跟静态方法内部类,普通方法内部类没什么问题,它属于外类的对象,所以肯定是需要对象来调用的,所以可以用this;

问题来了,静态方法内部类需不需要用外部类的对象来创建内部类的对象呢?根据它能用this来引用,说明是需要外类对象来创建的,可是这个方法不是属于外类的吗,应该不需要外类的对象就能直接用啊?

大神帮帮忙,非常感谢!


0 回复 有任何疑惑可以回复我~
#1

天启之魂

this的值到底是什么 你还是没弄清楚,你可以理解为this实际上是方法(非静态)在进栈后,方法里的一个局部,这个变量的值就是堆内存中某个对象的首地址值,即调用这个函数的对象的首地址值,你调用this.a 即表示你调用的是this指向的堆内存中的对象中的这个a 而方法内部类定义在方法中,可以理解这个内部类只是这个方法的一个局部变量,是没办法在外部直接获取的,你需要在方法中建立一个内部类的对象,这个对象在方法的内部,所以你只能通过访问这个方法来访问这个内部类的对象 如果这个方法时静态方法,这个静态方法在加载后还是会在堆内存中产生一个新对象,而这个对象的首地址值,就是内部类的this的值
2015-10-06 回复 有任何疑惑可以回复我~
#2

wswzh0329 提问者 回复 天启之魂

。。还是似懂非懂,堆内存跟栈还不了解,等以后在来理解吧,先记住结果。非常感谢!
2015-10-06 回复 有任何疑惑可以回复我~
#3

天启之魂

得到你个最佳回答真心不容易,几次被你绕进去了,有机会先学下栈内存和堆内存在建立对象时的内存体现,不然很多东西弄不清楚,imooc最不好的就是没有讲这些很关键的知识点
2015-10-06 回复 有任何疑惑可以回复我~
#4

wswzh0329 提问者 回复 天启之魂

。。能被我绕进去说明我扯的有道理啊,哈哈!再次感谢!
2015-10-06 回复 有任何疑惑可以回复我~
查看1条回复

 或者你没懂什么是静态!你想自己想清楚为什么静态不能使用this在来考虑别的问题

0 回复 有任何疑惑可以回复我~
#1

wswzh0329 提问者

。。我现在知道this使用的前提是要有当前对象,然后也看了static的相关知识,静态在对象之前就存在,加载了一次,放在内存中;然后又产生了新的问题: 字数太多了,放在下面,麻烦大神看一下!!
2015-10-06 回复 有任何疑惑可以回复我~

只想说一句 ,你根本没懂什么是this!就这!

0 回复 有任何疑惑可以回复我~

这是静态方法中的内部类中的使用:在内部类的普通方法下面可以使用this;在静态方法下面直接使用this就会报错--对应问题的第二点!(可以的话顺便帮我解决一下注释中带问号的问题,谢谢!)


//静态方法中的内部类    注:内部类中的方法只能是普通方法

public int a=1;                                                                    //只能(new Shiyan().a)来调用

public static int A=3;                           //(Shiyan.A)和(new Shiyan().A)和(Shiyan.this.A) 要是没有相同的还能用(A)

public static void print(){

int b=2;                                                                             //唯一的变量形式,要么设为final常量

                                               //要是有相同的b,如何取这个b的值??????????????????

class Inner{

public  int c=8;                                                                            //只能是普通方法

                                                                                  //(this.c)和(new Inner().c)来调用;要是没有相同的,还能(c);

public  void print(){                                                              //只能是普通方法,静态方法就会报错!

int d=4;                                                                                    //唯一的变量形式,理由跟上面的b相同

int c=4;

System.out.println(Shiyan.this.A);                                     //为什么可以用?

System.out.println(b);

System.out.println(this.c);

System.out.println(d);

}

}

System.out.println(this.A);                                                    //报错了?!

Inner in=new Inner();

in.print();

}


0 回复 有任何疑惑可以回复我~

  这是静态内部类中普通方法show()下面的调用出错的情况

    // 创建静态内部类

public  static        class SInner {

        // 内部类中的变量score

        int score = 91;

        

public void show() {

System.out.println("访问外部类中的score:" + HelloWorld.this.score           );

            //这里为什么不能用HelloWorld.this.score

System.out.println("访问内部类中的score:" + score);

}

}


0 回复 有任何疑惑可以回复我~

................调用静态变量两种  

一种是  类名.变量名 

一种是  对象名.变量名

你自己创造了第三种!不谢!


0 回复 有任何疑惑可以回复我~
#1

wswzh0329 提问者

。。在后面的尝试中我发现: 1.静态方法中不能使用(this。变量名)来调用静态变量,【Cannot use this in a static context】 那么,问题来了, 2.为什么在静态方法内部类中的方法中(普通方法)可以使用(Outer。this。变量名)来调用外部类的成员变量?--不是跟第一点冲突了?也是在静态方法下啊?!难道是内部类中的普通方法调用中调用而不是直接在外部类的静态方法中直接调用的原因? 3.在静态内部类中,同样是在普通方法下面,为什么使用Outer。this。变量名就报错了? 大哥帮忙解答一下! 下面有代码
2015-10-06 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

急急急!为什么用HelloWorld.this.score是错误的?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信