今天看到Java语法书内部类中的 匿名内部类和局部内部类 只能访问外部类的Final变量,不知道为什么这样设计,很是不解,不过后来想想发现好像只能这样.
首先明确一点的是:匿名内部类和局部内部类只能访问外部类的Final变量.
为什么会这样呢?既然是内部类了就想当然的 让他们能访问全部的外部类变量,但是后来一想确实有问题.
首先假如调用了外部类的一个方法f(),他内部有一个内部类class a和局部变量i,假如a中调用了变量i,当f结束的时候,i就跟着结束生命周期,a没有结束,那么就会出现a中访问一个不存在的内存地址,这样会导致严重错误.
为什么final变量可以呢,如果变量i定义为一个final类型,class a中用的就是变量的一份copy,和变量i是同样的值,当f()结束的时候,变量i跟着结束,但是a中的copy没有结束,而且和变量i保持同样的值.
最后,突然想到一个问题,String s = new String("ABC") + new String("ABC");
上面语句一共创造几次对象,个人感觉应该是4次,
第一次:碰到第一个“ABC”,在String池中创建一次String对象
第二次:碰到第一个new 在内存池创建一次String对象
第三次:碰到第二个new在内存池创建一次String对象(在String池中已经有过一次了,所以不再创建)
第四次:"ABCABC" 和在一起,在String内存池中创建一次String对象,传递给s对象.
个人感觉一共4次.
在Java中,非静态(匿名)内部类会默认隐性引用外部类对象。而静态内部类不会引用外部类对象