A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

当在一个方法里定义一个内部类时,当在调用该方法时,如果方法中的局部变量不是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)//不会出错
           }
     }
}

请问下,这是为什么呢?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

5 个回复

倒序浏览
简单一句话说内部类定义在局部时只能访问final修饰的局部变量,为什么呢?因为生命周期不同 方法中的局部变量,方法结束以后这个变量就要被释放掉.final保证这个变量始终指向一个对象,内部类就可以大胆直接指向该对象.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
简单的说,如果不加final的话,你这里的str是局部变量,当a()这个方法执行完,这个str局部变量就会在栈内存中被销毁。而你这个内部类,是作为一个类存在的,可能你这个方法已经结束了,但是这个类却还驻留在内存中,但是str已经消失了,内部类还在,内部类中要去哪里找str这个已经消失的变量呢?所以,没办法,编译器找不到,就会报错。因此,你必须将str声明为final,那么他就会一直存在于数据区中(可以叫常理池),那么即使方法结束了,那么这个变量还在,所以,不管这个内部类消失与否,都能访问str。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 恭喜25分~

查看全部评分

回复 使用道具 举报
额。。楼主求源代码,因为我想的是private不能修饰局部变量,因为局部变量都只作用在函数语句中呀。它会自动释放的,所以我就去编译了一下,我发现会报错诶~额所以我想看看源码,还有一个原因就是我不知道外部类怎么去访问函数里的内部类,所以所以楼主求源代码全部的,学习下谢谢~
回复 使用道具 举报
若还有问题,请继续追问; 没有的话,将帖子分类改成【已解决】哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马