精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-11
dengyin2000 写道 PS: 看不懂javap之后的东西。 ![]() 没有搞过汇编语言的话直接看JVM指令可能有点费劲, 翻译成Java语法就是这样: public class ShowAnony { public void test(final int n) { new ShowAnony$1(this, n).run(); } } final class ShowAnony$1 implements java.lang.Runnable { final int val$n; final ShowAnony this$0; ShowAnony$1(ShowAnony this$0, int n) { this.this$0 = this$0; this.val$n = n; } public void run() { this.val$n + 1; } } |
|
返回顶楼 | |
发表时间:2007-01-12
引用 拷贝的是引用(也就是地址)。 如果不是定义成final,然后在其他地方对这个变量进行赋值的话, 这个变量的地址就变了。 那么这个匿名类里面的地址就有可能是空的。应该是这样理解吧。 感谢两位的讨论,现在差不多搞清了,对于不定义成final,如果在其他地方对变量进行赋值,这个变量的地址是变了,但匿名类里面的变量还是指向原先的地址(因为匿名类还引用它,所以不会被垃圾回收),和外层变量指向的地址不一致了,这样就产生了语意的不一致,而不是匿名类里面的地址就有可能是空的。 |
|
返回顶楼 | |
发表时间:2007-01-12
balaschen 写道 引用 拷贝的是引用(也就是地址)。 如果不是定义成final,然后在其他地方对这个变量进行赋值的话, 这个变量的地址就变了。 那么这个匿名类里面的地址就有可能是空的。应该是这样理解吧。 感谢两位的讨论,现在差不多搞清了,对于不定义成final,如果在其他地方对变量进行赋值,这个变量的地址是变了,但匿名类里面的变量还是指向原先的地址(因为匿名类还引用它,所以不会被垃圾回收),和外层变量指向的地址不一致了,这样就产生了语意的不一致,而不是匿名类里面的地址就有可能是空的。 你这里的“语意”是指什么? 对, 这里不是为空, 而是不同的对象了。 |
|
返回顶楼 | |
发表时间:2007-01-12
语义,错别字:)
|
|
返回顶楼 | |