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

来源:7-7 Java 中的静态内部类

wswzh0329

2015-10-04 14:14

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

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

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

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

写回答 关注

7回答

  • 天启之魂
    2015-10-06 21:06:25
    已采纳

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

    wswzh0...

    非常感谢!

    2015-10-06 22:23:29

    共 1 条回复 >

  • wswzh0329
    2015-10-06 18:36:35

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

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

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

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

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

    接着就具体的判断:

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

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

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

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

    大神帮帮忙,非常感谢!


    wswzh0... 回复天启之魂

    。。能被我绕进去说明我扯的有道理啊,哈哈!再次感谢!

    2015-10-06 22:46:31

    共 4 条回复 >

  • 天启之魂
    2015-10-06 13:51:58

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

    wswzh0...

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

    2015-10-06 18:36:07

    共 1 条回复 >

  • 天启之魂
    2015-10-06 13:50:24

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

  • wswzh0329
    2015-10-06 12:20:07

    这是静态方法中的内部类中的使用:在内部类的普通方法下面可以使用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();

    }


  • wswzh0329
    2015-10-06 12:14:28

      这是静态内部类中普通方法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);

    }

    }


  • 天启之魂
    2015-10-04 17:47:17

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

    一种是  类名.变量名 

    一种是  对象名.变量名

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


    wswzh0...

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

    2015-10-06 12:13:05

    共 1 条回复 >

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530644 学习 · 6091 问题

查看课程

相似问题