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

标签 java constructor inner-classes

我没想到在这个阶段我会在 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 提示什么,它在第二个版本中做了什么?

背景信息:ButtonButton.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/

相关文章:

java - 声明为内部类时 switch 语句中枚举值的行为

java - final 在 Java 中做什么? - 困难版

java - 为什么JDK7不允许方法局部内部类访问自己方法的局部变量

java - 如何创建 Activity 对象 'IN'条件查询

java - 我如何判断是否创建了任何mockito对象

C++子级在复制构造函数和输出之间的某个时刻更改父级成员

C++无法实现默认构造函数

java - Java 7 中的闭包如何工作?

java - 如何为 Avro Union 逻辑类型字段中的默认值指定转换器?

c++ - 模板的构造函数和析构函数的名称