关于方法内部类的变量问题

来源:7-8 Java 中的方法内部类

wswzh0329

2015-10-05 00:52

在这种程序中有三层变量,分别是外部类中声明的成员变量、外部类的方法中的局部变量、该方法中的方法内部类中声明的该类的成员变量;

假设在该方法内部类中的方法对这三层变量都要调用:

1。要是这些变量都没有重名的,如何调用?

2、要是这三层的变量中都有重名的,如何调用并区分开?


写回答 关注

4回答

  • 倔驴
    2015-10-06 11:14:57
    已采纳

    根据之前看到的关于成员变量和局部变量的介绍中我还看到了这样一句话“局部变量是在类的方法中定义,在方法中临时保存数据”,也就是说这个方法中的变量是临时性的,还有我看了其他人关于这方面的解答,他们是这样说的“

    方法中的变量是一个局部变量,局部变量是储存在栈内存中,当方法结束后(弹栈),这个变量就消失了(方法就消失了),所以内部类可能没办法读取到这个变量.顺便说下 如果你完全是自己照着imooc里面的教程学的,你估计看不懂我说的,因为imooc到第二季还没提到过内存方面的内容.(我也是不懂,自己找资料学的)

    我想他的意思也就是那个方法中的变量可能就是一个临时变量,数据不能一直保存,所以方法内部类无法调用吧,我是这么理解的,希望能帮到你。

    wswzh0...

    。。不知道你搞懂没,现在回来看发现能够理解回答你的那个人说的了,方法中的局部变量在这个方法执行完毕之后就消失了,但是内部类或者说内部类的对象仍然存在,只要还有引用指向这个内部类对象,那么该对象就不会被释放,而此时要用到的局部变量已经不存在了,所以就会出错!只有final的局部变量的作用域跟该类的作用域一样!

    2015-10-18 20:13:41

    共 4 条回复 >

  • wswzh0329
    2015-10-06 11:37:53

    。。这是我自己在eclipse上面尝试的结果

    package com.shiyan2;


    import com.shiyan3.Test.Inner;


    public class Shiyan {


    /* //普通方法中的内部类的调用

        static int a=2;     //可以通过(Shiyan.this.a)和(Shiyan.a)和(new Shiyan().a)调用;要是没有相同的还能用(a)来调用

       int b=7;     //普通变量     可以通过(Shiyan.this.b)和(new Shiyan().b)来调用;要是没有相同的话可以用(b)来调用;

       

       public void print(){

     int b=2;              //方法中的变量不能设为public

     //该如何调用??????????

     class Inner{

     public int  c=4; //方法内部类中的成员变量可以设置为public

         public int b=6;  //(this.b)和(new Inner().b)来调用

     public void print(){

      int d=4; 

      int c=5;//为什么默认的friendly可以,更加私有的private不可以,只能用final????????

     System.out.println(new Shiyan().a);

     System.out.println(Shiyan.this.b);

     System.out.println(this.c);

     System.out.println(d);

     }

     

     }

    Inner in=new Inner();

    in.print();

      

       }*/


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

    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);

    }

    }

    Inner in=new Inner();

    in.print();

    }

    */

    //测试类

    /*

       public static void main(String[] args) {

    Shiyan test=new Shiyan();

    test.print();

    }*/

    }


  • 倔驴
    2015-10-06 11:33:53

    恩恩,你说的对,我再去找书看看去,你要是找到了麻烦记得告诉我一下,谢了哈!

    wswzh0...

    。。你有找到答案吗

    2015-10-06 18:54:34

    共 1 条回复 >

  • 倔驴
    2015-10-06 01:15:17

    我是根据你的问题自己敲代码试的,所以可能有些不对的还请见谅。

    1,如果三层变量都不相同,可以直接调用,如:a,b,c,则直接+a,+b,+c,即可。

    2,如果三层变量都为a,在调用时如果只写+a,则只会调用该方法的方法内部类中声明的该类的成员变量,也就是最底下那层,如果想调用外部类中声明的变量,则可以使用:(外部类名.this.变量名)这种形式即可,但是调用外部方法中的局部变量我也不知道了,希望有其他大神看到了能帮忙解决一下。

    wswzh0...

    。。非常感谢你的解答! 其实今天回头一想发现有四层变量,外部类的成员变量、方法中的局部变量、该方法中的内部类的成员变量、内部类的方法中的局部变量, 不过类内的变量调用应该跟前面学到的一样调用,就是在类内部成员变量跟局部变量的调用; 然后外部类的成员变量应该(是new Outer().变量名)和(外部类名.this.变量名)都可以; 剩下的外部类方法中的局部变量还是调用不出来。。。

    2015-10-06 09:55:53

    共 1 条回复 >

Java入门第二季 升级版

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

530649 学习 · 6091 问题

查看课程

相似问题