论坛首页 Java企业应用论坛

InnerClass引用的外层local final变量,究竟具有什么语义

浏览 11188 次
精华帖 (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;
  }

}

0 请登录后投票
   发表时间:2007-01-12  
引用

拷贝的是引用(也就是地址)。 如果不是定义成final,然后在其他地方对这个变量进行赋值的话, 这个变量的地址就变了。 那么这个匿名类里面的地址就有可能是空的。应该是这样理解吧。


感谢两位的讨论,现在差不多搞清了,对于不定义成final,如果在其他地方对变量进行赋值,这个变量的地址是变了,但匿名类里面的变量还是指向原先的地址(因为匿名类还引用它,所以不会被垃圾回收),和外层变量指向的地址不一致了,这样就产生了语意的不一致,而不是匿名类里面的地址就有可能是空的。
0 请登录后投票
   发表时间:2007-01-12  
balaschen 写道
引用

拷贝的是引用(也就是地址)。 如果不是定义成final,然后在其他地方对这个变量进行赋值的话, 这个变量的地址就变了。 那么这个匿名类里面的地址就有可能是空的。应该是这样理解吧。


感谢两位的讨论,现在差不多搞清了,对于不定义成final,如果在其他地方对变量进行赋值,这个变量的地址是变了,但匿名类里面的变量还是指向原先的地址(因为匿名类还引用它,所以不会被垃圾回收),和外层变量指向的地址不一致了,这样就产生了语意的不一致,而不是匿名类里面的地址就有可能是空的。


你这里的“语意”是指什么?

对, 这里不是为空, 而是不同的对象了。
0 请登录后投票
   发表时间:2007-01-12  
语义,错别字:)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics