我在阅读Java Puzzlers时发现了以下功能
public class Main {
public static void main(String[] args) {
new Object() {
void helloWorld() {
System.out.println("Hello world!");
}
}.helloWorld();
}
}
我发现这非常方便。非常封闭。问题是我找不到关于这个结构的任何信息。任何人都可以向我提供描述此功能的链接吗?
答案 0 :(得分:3)
这是一个匿名内部类的示例。自Java 1.1以来一直受到支持。
这似乎是封闭式的,但事实上有一些限制 1 使它小于真正的闭包。但是,尽管有这些限制,匿名内部类仍然非常有用......并且在Swing和需要轻量级回调的类似框架中广泛使用。
参考文献:
1 - 匿名内部类(或命名内部类)不像真正的闭包那样的原因是不允许在封闭范围内引用可变局部变量。您可以引用实例变量或final
局部变量,但命名非final
局部变量(或方法参数变量)是编译错误。
答案 1 :(得分:2)
new Object() {
void helloWorld() {
System.out.println("Hello world!");
}
}.helloWorld();
这意味着,创建一个扩展Object的匿名类的实例,然后在其上调用方法.helloWorld()。
答案 2 :(得分:0)
Java规范15.9.5。匿名类声明和15.9.5.1。匿名构造函数 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.5