【问题标题】:Use of Anonymous Inner Class in javajava中匿名内部类的使用
【发布时间】:2013-05-21 02:47:32
【问题描述】:
public SampleBehaviour otherway(final String st) {
    return new SampleBehaviour() {
        private String str = st;

        @Override
        public void print() {
            System.out.println("val:"+val);
        }

    };
}

SampleBehaviour 是一个接口。

实现接口的类必须定义方法行为,接口中的一些变量有什么用?

为什么方法参数必须是final的?我没有得到这种类型的使用的一些实时应用程序?这背后的真实情况是什么?

如果有用,为什么 C++ 没有这样的东西?

【问题讨论】:

  • 如果它有用,为什么我们 C++ 没有这样的东西?因为这不是语言的设计方式。
  • 回到你的问题,匿名类不允许修改方法参数的引用,所以必须将它们标记为final才能在匿名类中使用。
  • @LuiggiMendoza 为什么不应该修改?
  • 这就是它的设计方式。参考Anonymous ClassesJSL: 15.9.5. Anonymous Class Declarations
  • 一行:这是因为Java不支持词法闭包。语言设计者认为引入它们会带来更多的代码可读性问题而不是产生收益。

标签: java anonymous-inner-class


【解决方案1】:

来自The Java Language Specification,第 8.1.3 节:

任何使用但未在内部类中声明的局部变量、形参或异常参数都必须声明为 final。

*说内部类需要保留自己的变量副本,因为它可以在外部类超出范围后继续存在;为了防止相同的变量名引用两个不同的位置,他们强制将变量固定到位。

【讨论】: