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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周亮 中级黑马   /  2012-12-30 14:04  /  2000 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

匿名内部类访问外部类的属性除了使用final还有什么其他的方式?

评分

参与人数 1黑马币 +1 收起 理由
刘芮铭 + 1

查看全部评分

4 个回复

正序浏览
内部类只能访问被final修饰的局部变量
回复 使用道具 举报
内部类有两种:成员内部类,局部内部类。成员内部类肯定是有名字的。所以匿名内部类肯定是局部内部类。
而局部内部类肯定是在某个方法中的。

为什么局部内部类只能访问final变量
简单的来说是作用域的问题。就好像方法外面做的事情并不能改变方法内才定义的变量,因为你并不知道方法里面这个时候已经存在了这个局部变量了没有。在这个内部类中方法里面的本地变量是失效的,也就是不在作用域内,所以是不能够访问的
但是为什么这里用final却又可以访问呢?
因为Java采用了一种copy   local   variable的方式来实现,也就是说把定义为final的局部变量拷贝过来用,而引用的也可以拿过来用,只是不能重新赋值。从而造成了可以access   local   variable的假象,而这个时候由于不能重新赋值,所以一般不会造成不可预料的事情发生

这段话要多读几遍去理解。

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

回复 使用道具 举报
我记得有这样一句话:“内部对象不能使用该内部类所在方法的局部变量,除非该变量为final” 这句话我的理解是:
我们都知道,当一个方法结束的时候,其栈结构就会被销毁。但是从方法中创建的对象仍然可以在堆中。也就是说局部变量的寿命与方法本地内部类对象寿命不一定是一样的长,如果方法本地内部类依赖了方法的一个局部变量,那么当方法结束的时候,本地内部类却依然存在于对象堆之中,但是却找不到方法的局部变量了--随着方法的结束,其堆结构就挂菜了,该局部变量也就没了。为啥final就可以呢,那是因为final变量的寿命要大于方法的寿命

评分

参与人数 1黑马币 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
对于方法中的内部类或块中内部类只能访问块中或方法中的final变量。 类成员有两种static , non-static,同样内部类也有这两种non-static 内部类的实例,必须在外部类的方法中创建或通过外部类的实例来创建(OuterClassInstanceName.new innerClassName(ConstructorParameter)),并且可直接访问外部类的信息,外部类对象可通过OuterClassName.this来引用static 内部类的实例, 直接创建即可,没有对外部类实例的引用。内部类不管static还是non-static都有对外部类的引用non-static 内部类不允许有static成员方法中的内部类只允许访问方法中的final局部变量和方法的final参数列表,所以说方法中的内部类和内部类没什麽区别。但方法中的内部类不能在方法以外访问,方法中不可以有static内部类匿名内部类如果继承自接口,必须实现指定接口的方法,且无参数 匿名内部类如果继承自类,参数必须按父类的构造函数的参数传递

评分

参与人数 1黑马币 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马