楼主请耐心看完我的例子- public class Demo{
- public static void main(String[] args) {
- int x = 1;
-
- Object c = new Fin().getC();//c引用了局部内部类对象。
- System.out.println(c.toString());
- }
-
- }
- class Fin{
- int x = 0;
-
- class In{
- public void showX(){
- System.out.println(x);
- }
- }
-
- public Object getC(){
- final int y = 1;//如果 这里的 y 没有被final 修饰
- //在内部类Inner 中就可以出现 y = y+1;
-
- //Inner in = new Inner();
- class Inner{
- int z = 5;
- public int showY(){
- //y = y +1;
- System.out.println(y);
- x = x +1;
- return x; //之所以可以引用外部类的成员,是因为在使用getC方法时
- //必须先创建外部类Fin的对象。
- }
-
- public String toString(){
- System.out.println("reachable?");
- return (y+z+showY())+"";
- }
- }
-
- Inner in = new Inner();
-
- in.showY();
-
- return in;
- //因为getC返回Inner对象,
- //该对象被其他外部类的参数引用,所以当getC 生命周期结束时,
- //Inner 对象的生命周期没有结束。(第9行 被 c 引用). 因此 y的生命周期已经结束
- //Inner 要使用y的值就必须 把y 复制到 它的对象中,而不能直接引用。
- //所以变量 y 的值是不能在内部类中被赋值的, 即 y = y + 1;这样的操作不会把 y的 赋值为 2;
- //所以为了表明这种操作不成立,或为了避免这样的操作,就必须保证y 是不可变的,即
- //y 的值要用final修饰。
- }
- }
复制代码 |