黑马程序员技术交流社区
标题:
关于在方法里定义内部类调用方法的成员时的问题?
[打印本页]
作者:
熊永标
时间:
2013-3-28 18:01
标题:
关于在方法里定义内部类调用方法的成员时的问题?
当在一个方法里定义一个内部类时,当在调用该方法时,如果方法中的局部变量不是final修饰的话会出错,在此种情况下加final和不加final有什么区别呢,为什么加了就不会出错呢?如下:
public void a(){
private String str="aaaaaaa";
private class Internal{
public void InternalB(){
System.out.println(str)//会出错
}
}
}
public void a(){
private finall String str="aaaaaaa";
private class Internal{
public void InternalB(){
System.out.println(str)//不会出错
}
}
}
请问下,这是为什么呢?
作者:
炉海佳
时间:
2013-3-28 18:42
简单一句话说内部类定义在局部时只能访问final修饰的局部变量,为什么呢?因为生命周期不同 方法中的局部变量,方法结束以后这个变量就要被释放掉.final保证这个变量始终指向一个对象,内部类就可以大胆直接指向该对象.
作者:
小黑黑
时间:
2013-3-28 18:44
简单的说,如果不加final的话,你这里的str是局部变量,当a()这个方法执行完,这个str局部变量就会在栈内存中被销毁。而你这个内部类,是作为一个类存在的,可能你这个方法已经结束了,但是这个类却还驻留在内存中,但是str已经消失了,内部类还在,内部类中要去哪里找str这个已经消失的变量呢?所以,没办法,编译器找不到,就会报错。因此,你必须将str声明为final,那么他就会一直存在于数据区中(可以叫常理池),那么即使方法结束了,那么这个变量还在,所以,不管这个内部类消失与否,都能访问str。
作者:
谭辉
时间:
2013-3-28 19:19
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
作者:
王薪婷
时间:
2013-3-28 19:24
额。。楼主求源代码,因为我想的是private不能修饰局部变量,因为局部变量都只作用在函数语句中呀。它会自动释放的,所以我就去编译了一下,我发现会报错诶~额所以我想看看源码,还有一个原因就是我不知道外部类怎么去访问函数里的内部类,所以所以楼主求源代码全部的,学习下谢谢~
作者:
陈丽莉
时间:
2013-3-28 21:47
若还有问题,请继续追问; 没有的话,将帖子分类改成【已解决】哦~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2