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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

匿名内部类访问外界成员变量时:外界的类名.this.成员变量
匿名内部类访问外界局部变量时:final.局部变量

不知道有没有特殊的情况,另外这种写法不知道是否严谨

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

4 个回复

正序浏览
  实例内部类自动持有外部类的实例的引用,即可以访问外部类的所有变量;

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

  定义在方法中的内部类叫局部内部类,该类只能访问被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();}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
自己写的代码,希望对你有帮助。。。
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();

        }

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
内部类中访问成员变量不一定要设为final,如果是static 也行;
不过要看是 内部类 还是 匿名内部类
内部类:要将成员变量设为static ;
匿名内部类:要将成员变量设为 static final;

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

感觉还是final常用一些吧

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
我认为不是那么的严谨。有没有考虑静态的问题呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马