在匿名内部类中只有final变量是可访问的的原因

摘要

在Java中,只有final变量可以在匿名内部类中访问。这篇文章将解释为什么只有final变量可以在匿名内部类中访问,并提供几种解决方案。

内容

在Java中,只有final变量可以在匿名内部类中访问。这是因为在匿名内部类中,当变量被匿名内部类引用时,其值被复制到内部类的实例中。这样做的目的是为了避免复杂的编译器生成代码来处理不同作用域变量的状态。

以下是解决这个问题的一些方法:

  1. 在变量前添加final关键字。
1private void f(Button b, final int a){
2    b.addClickHandler(new ClickHandler() {
3        @Override
4        public void onClick(ClickEvent event) {
5            int b = a*5;
6        }
7    });
8}
  1. 将变量提升为类级别的字段。
 1class Example {
 2    private int a;
 3
 4    private void f(Button b, int a) {
 5        this.a = a;
 6
 7        b.addClickHandler(new ClickHandler() {
 8            @Override
 9            public void onClick(ClickEvent event) {
10                int b = Example.this.a * 5;
11            }
12        });
13    }
14}

总结

在匿名内部类中,只有final变量是可访问的,因为它们的值在复制到匿名内部类实例时被固定。这种做法可以避免复杂的编译器生成代码来处理作用域之间的状态。根据具体需


相关文章推荐