黑马程序员技术交流社区
标题:
内部类调用外部类的变量要用final修饰吗,为什么?
[打印本页]
作者:
黑马-许鹏
时间:
2013-5-29 15:43
标题:
内部类调用外部类的变量要用final修饰吗,为什么?
话说,内部类调用方法区的局部变量,该局部变量必须要用final修饰。如果调用外部类的成员变量,要修饰吗?为什么。它们在内存中的结构是什么样的呢?希望有人能解释的很详细,困惑很久了……
作者:
First
时间:
2013-5-30 02:13
楼主请耐心看完我的例子
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修饰。
}
}
复制代码
作者:
黑马-许鹏
时间:
2013-5-30 02:27
First 发表于 2013-5-30 02:13
楼主请耐心看完我的例子
认真看完了 谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2