用于实例化内部类的奇怪语法

2022-09-01 01:21:57

我没有想到在这个阶段我会在Java中遇到全新的语法,但是瞧,我只是遇到了一些东西:

确切的上下文和下面的代码应该做什么是无关紧要的 - 它只是为了提供某种上下文。

我试图在IT Mill Toolkit中综合创建一个事件,所以我写了这样一行:

buttonClick(new Button.ClickEvent(button));

但是,Eclipse给了我以下错误消息:

无法访问 Button 类型的封闭实例。必须使用 Button 类型的封闭实例(例如 x.new A(),其中 x 是 Button 的实例)限定分配。

当我按如下方式重写上面的行时,它不再抱怨了:

buttonClick(button.new ClickEvent(button)); // button instanceof Button

所以,我的问题是:后一种语法到底是什么意思,为什么第一个片段不起作用?Java在抱怨什么,它在第二个版本中做了什么?

背景信息:ButtonButton.ClickEvent 都是非抽象的公共类。


答案 1

内部类(如 )需要对外部类 () 的实例的引用。Button.ClickEventButton

该语法创建一个新实例,其外部类引用设置为 值 。Button.ClickEventbutton

这里有一个例子 - 忽略缺乏封装等,它只是为了演示的目的:

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();
    }
}

有关内部类和封闭实例的更多信息,请参阅规范的 8.1.3 节


答案 2

Button.ClickEvent 是一个非静态内部类,因此此类的实例只能包含在 Button 的实例中。

在第二个代码示例中,您有一个 Button 实例,并且您创建了一个包含在此 Button 实例中的 ClickEvent 实例...