黑马程序员技术交流社区

标题: 内部类调用外部类的变量要用final修饰吗,为什么? [打印本页]

作者: 黑马-许鹏    时间: 2013-5-29 15:43
标题: 内部类调用外部类的变量要用final修饰吗,为什么?
话说,内部类调用方法区的局部变量,该局部变量必须要用final修饰。如果调用外部类的成员变量,要修饰吗?为什么。它们在内存中的结构是什么样的呢?希望有人能解释的很详细,困惑很久了……
作者: First    时间: 2013-5-30 02:13
楼主请耐心看完我的例子
  1. public class Demo{

  2.         public static void main(String[] args) {
  3.                 int x = 1;
  4.                
  5.                 Object c = new Fin().getC();//c引用了局部内部类对象。
  6.                 System.out.println(c.toString());
  7.         }
  8.        
  9. }

  10. class Fin{
  11.         int x = 0;
  12.        
  13.         class In{
  14.                 public void showX(){
  15.                         System.out.println(x);
  16.                 }
  17.         }
  18.        
  19.         public Object getC(){
  20.                 final int y = 1;//如果 这里的 y 没有被final 修饰
  21.                 //在内部类Inner 中就可以出现 y = y+1;
  22.                
  23.                 //Inner in = new Inner();
  24.                 class Inner{
  25.                         int z = 5;
  26.                         public int showY(){
  27.                                 //y = y +1;
  28.                                 System.out.println(y);
  29.                                 x = x +1;
  30.                                 return x; //之所以可以引用外部类的成员,是因为在使用getC方法时
  31.                                 //必须先创建外部类Fin的对象。
  32.                         }
  33.                        
  34.                         public String toString(){
  35.                                 System.out.println("reachable?");
  36.                                 return (y+z+showY())+"";
  37.                         }
  38.                 }
  39.                
  40.                 Inner in = new Inner();
  41.                
  42.                 in.showY();
  43.                
  44.                 return in;
  45.                 //因为getC返回Inner对象,
  46.                 //该对象被其他外部类的参数引用,所以当getC 生命周期结束时,
  47.                 //Inner 对象的生命周期没有结束。(第9行 被 c 引用). 因此 y的生命周期已经结束
  48.                 //Inner 要使用y的值就必须 把y 复制到 它的对象中,而不能直接引用。
  49.                 //所以变量 y 的值是不能在内部类中被赋值的, 即 y = y + 1;这样的操作不会把 y的 赋值为 2;
  50.                 //所以为了表明这种操作不成立,或为了避免这样的操作,就必须保证y 是不可变的,即
  51.                 //y 的值要用final修饰。
  52.         }
  53. }
复制代码

作者: 黑马-许鹏    时间: 2013-5-30 02:27
First 发表于 2013-5-30 02:13
楼主请耐心看完我的例子

认真看完了 谢谢




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