我没想到在这个阶段我会在 Java 中遇到全新的语法,但是你瞧,我只是遇到了一些事情:
确切的上下文和下面的代码应该做什么是无关紧要的——它只是为了提供某种上下文。
我正在尝试在 IT Mill Toolkit 中综合创建一个事件,所以我写了这样一行:
buttonClick(new Button.ClickEvent(button));
但是,Eclipse 给了我以下错误信息:
No enclosing instance of type Button is accessible. Must qualify the allocation with an enclosing instance of type Button (e.g. x.new A() where x is an instance of Button).
当我将上面的行改写如下时,它不再提示了:
buttonClick(button.new ClickEvent(button)); // button instanceof Button
所以,我的问题是:后一种语法到底是什么意思,为什么第一个片段不起作用?Java 提示什么,它在第二个版本中做了什么?
背景信息:Button
和 Button.ClickEvent
都是非抽象的公共(public)类。
最佳答案
内部类(如Button.ClickEvent
)需要引用外部类(Button
)的实例。
该语法创建了一个新的 Button.ClickEvent
实例,其外部类引用设置为 button
的值。
这是一个例子 - 忽略缺少封装等,这只是为了演示:
class Outer
{
String name;
class Inner
{
void sayHi()
{
System.out.println("Outer name = " + name);
}
}
}
public class Test
{
public static void main(String[] args)
{
Outer outer = new Outer();
outer.name = "Fred";
Outer.Inner inner = outer.new Inner();
inner.sayHi();
}
}
见 section 8.1.3 of the spec有关内部类和封闭实例的更多信息。
关于java - 用于实例化内部类的奇怪语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/633585/