黑马程序员技术交流社区

标题: 匿名内部类访问外面的成员变量和局部变量的问题 [打印本页]

作者: 黑马-zhangping    时间: 2012-11-1 19:08
标题: 匿名内部类访问外面的成员变量和局部变量的问题
匿名内部类访问外界成员变量时:外界的类名.this.成员变量
匿名内部类访问外界局部变量时:final.局部变量

不知道有没有特殊的情况,另外这种写法不知道是否严谨
作者: 王永彬    时间: 2012-11-1 19:49
我认为不是那么的严谨。有没有考虑静态的问题呢?
作者: 刘丽娜    时间: 2012-11-1 20:19
内部类中访问成员变量不一定要设为final,如果是static 也行;
不过要看是 内部类 还是 匿名内部类
内部类:要将成员变量设为static ;
匿名内部类:要将成员变量设为 static final;

内部类中访问变量是默认  this.变量  ;而this代表:内部类;所以要static 或final;

感觉还是final常用一些吧
作者: 林志进    时间: 2012-11-1 23:39
自己写的代码,希望对你有帮助。。。
public class Test3 {
        private static int xx = 5;
        private final int xxx = 5;       

        public static void main(String[] args) {

                Object test = get(true);
                System.out.println(test.toString());

        }

        /*
         * 无论是匿名内部类或者局部内部类,他们要访问本类所在方法的局部变量时,变量必须是final修饰的
         * 原因:内部类test的调用toString方法时候,如果该局部方法get{}在栈内存中已经被回收了,
         * 而内部类的变量x,y还在该方法中,他们还可能继续访问它,那么就会有异常。
         * 而使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期.
         * 所以这才是final变量和final参数的根本意义.
         */
        public static Object get(boolean bol) {

                final String x = "anonymity";
                final String y = "PartialClass";

                if (bol) {// 返回匿名内部类
                        Object anonymity = new Object() {
                                public String toString() {
                                        System.out.println(Test3.xx);//访问声明为static的
                                        System.out.println(Test3.this.xxx);// 访问声明的final
                                        return x.toString();
                                }
                        };
                        return anonymity;
                }

                class PartialClass { // 返回局部内部类
                        public String toString() {
                                return y.toString();
                        }
                }
                return new PartialClass();

        }
作者: 奋斗的青春    时间: 2012-11-2 08:11
  实例内部类自动持有外部类的实例的引用,即可以访问外部类的所有变量;

  静态内部类可以直接访问外部类的静态成员;

  定义在方法中的内部类叫局部内部类,该类只能访问被final修饰的局部变量和参数

  接口定义如下:

  view plainprint?

  interface Super{ public void print();} view plainprint?

  //例子1:public class Test { int c=18;public Super getInstance(){ int a=5;final int b=6;class Inner implements Super{ public void print() { //局部内部类中访问本方法的局部变量System.out.println(a);//编译错误: 从内部类中访问局部变量 a;需要被声明为final //内部类中访问成员变量System.out.println(b);//正常System.out.println(c);//正常} return new Inner();}

  public static void main(String[] args) { Super s=new Test()。getInstance();s.print();}例子2:对上面例子1的例子改变一下,从内部类->匿名内部类匿名内部类既然叫匿名,那么名字对于该类来说已经不重要,因为该匿名类的实例本来就不打算给别的类使用或重复使用,仅限于类内部使用或使用一次,所以就不需要类名了,不过因为没有类名匿名内部类也就没有构造函数了。

  在方法里面定义的局部内部类(不管是否匿名),它可无条件访问外部类的成员变量,但要访问方法的局部变量或参数,就要加final修饰符。

  view plainprint?

  public class Test { int c=18;public Super getInstance(){ int a=5;final int b=6;return new Super(){ public void print() { //局部内部类中访问本方法的局部变量System.out.println(a);//编译错误: 从内部类中访问局部变量 a;需要被声明为final System.out.println(b);//正常System.out.println(c);//正常} };} public static void main(String[] args) { Super s=new Test()。getInstance();s.print();}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2