黑马程序员技术交流社区
标题:
关于内部类的问题
[打印本页]
作者:
于星星
时间:
2012-7-18 21:19
标题:
关于内部类的问题
我写了一个内部类,内部类里有一个方法,就是将字符串变成大写。
public class Outer {
public static void main(String[] args) {
new Test2().show();
}
public void show(){
final String str1 = "adsfasdf";
//这里没有将str2设为final,编译有错,为什么?
//String str2 = "javaee";
//System.out.println(new Inner().up()); 为什么创建内部类对象的代码放在这里就报错?
class Inner{
public String up(){
return str1.toUpperCase();
}
};
System.out.println(new Inner().up());
}
}
作者:
黑马-王言龙
时间:
2012-7-18 21:37
本帖最后由 黑马-王言龙 于 2012-7-18 22:10 编辑
public class Demo2 {
public static void main(String[] args) {
new Demo2().show();
}
public void show(){
final String str1 = "adsfasdf";
//这里没有将str2设为final,编译有错,为什么?
//1、这是局部内部类访问局部变量的问题,必须加final。关系到内存泄漏方面的问题。详见后面
//String str2 = "javaee";
System.out.println(new Inner().up()); //为什么创建内部类对象的代码放在这里就报错?
//2、此show()方法执行到这一步时,内部类Inner还没有加载到内存中,是不能创建对象的。
class Inner {
public String up(){
return str1.toUpperCase();
}
};
System.out.println(new Inner().up());
}
}
1、从内存中看,当方法里的局部变量所在方法结束时,该变量即在栈内存中消失;而内部类其实是一个类,只有内存中对它的所有引用都消失后,
该内部类才"死亡",即内部类的生命周期可能比局部变量长,为了避免方法内的变量脱离方法而存在的现象发生(如果局部内部类能访问局部变量,那方法结束后,局部变量可能还在被局部内部类使用,这在多线程中很容易解释),于是java规定局部内部类不能访问一般的局部变量。但能访问被final修饰的局部变量。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2