【问题标题】:Unknown Java 7 feature [duplicate]未知的 Java 7 功能 [重复]
【发布时间】:2012-12-14 04:49:46
【问题描述】:

可能重复:
How are Anonymous (inner) classes used in Java?

我在阅读 Java Puzzlers 时发现了以下功能

public class Main {
    public static void main(String[] args) {
        new Object() {
            void helloWorld() {
                System.out.println("Hello world!");
            }
        }.helloWorld();
    }
}

我发现这非常方便。非常像封闭。问题是我找不到有关此构造的任何信息。谁能给我一个描述这个功能的链接?

【问题讨论】:

  • 这不是 Java 7 独有的。这是一个匿名类。
  • 哇,我一直都知道讨厌的类,但我不知道它可以这样使用。发布此内容后,我确实发现了一些限制。
  • 致下面的海报:静态上下文中的匿名类在 中是不可能的

标签: java language-features


【解决方案1】:

这是一个匿名内部类的例子。从 Java 1.1 开始支持它。

这可能看起来像闭包,但实际上存在一些限制1,使其不如真正的闭包。然而,尽管有这些限制,匿名内部类仍然非常有用......并广泛用于 Swing 和需要轻量级回调的类似框架。

参考资料:


1 - 匿名内部类(或命名内部类)不像真正的闭包的原因是它不允许在封闭范围内引用可变局部变量。可以引用实例变量或final局部变量,但命名非final局部变量(或方法参数变量)是编译错误。

【讨论】:

    【解决方案2】:
    new Object() {
        void helloWorld() {
            System.out.println("Hello world!");
        }
    }.helloWorld();
    

    这意味着,创建一个扩展 Object 的匿名类的实例,然后在其上调用方法 .helloWorld()。

    【讨论】:

      【解决方案3】:

      Java 规范 15.9.5。匿名类声明和 15.9.5.1。匿名构造函数 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.5

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-09
        • 2017-12-17
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 1970-01-01
        相关资源
        最近更新 更多