当前位置: 首页 > 面试题库 >

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

江德海
2023-03-14
问题内容

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

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

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

buttonClick(new Button.ClickEvent(button));

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

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

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

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

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

背景信息:ButtonButton.ClickEvent均为非html" target="_blank">抽象公共类。


问题答案:

内部类(如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();
    }
}

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



 类似资料:
  • 问题内容: 我有一个实用程序方法,当从中删除了不相关的逻辑时,简化的方法将如下所示: 问题是,如果是诸如的内部类,则该方法即使是公共方法也将不起作用,因为它将抛出。 有没有办法动态实例化内部类? 问题答案: 如果它是真正的 内部 类而不是 嵌套 (静态)类,则有一个隐式构造函数参数,它是对外部类实例的引用。在那个阶段您不能使用- 必须获得适当的构造函数。这是一个例子:

  • 这是个模糊的问题。因此,请随时询问任何具体数据。 我们有一个tomcat服务器,运行两个web服务。一个tomcat使用spring构建。90%的任务使用mysql,JSON缓存使用mongo(10%)。另一个web服务是使用grails编写的。这两项服务都是中等大小的代码库(每项约35k行代码) 计算仅在有HTTP请求(无批处理)时发生。每个请求大约有2000个数据库点击率(我知道它非常庞大,我

  • 问题内容: 是否可以使用Java反射从另一个类实例化私有内部类。例如,如果我采用了这段代码 是否可以实例化并从main类中的main方法获得对Test的访问。 问题答案: 使用反射时,您会发现该内部类的构造函数将外部类的实例作为附加参数(总是第一个)。 例:

  • 是否可以从类main中的main方法实例化并获得对Test的访问。

  • 问题内容: 在分析这里最近一个问题的结果时,我遇到了一个非常奇怪的现象:显然HotSpot的JIT优化的额外一层实际上减慢了我的计算机的执行速度。 这是我用于测量的代码: 该代码非常微妙,所以让我指出一些重要的方面: “普通索引”变体使用直接变量作为数组索引。HotSpot可以轻松确定整个循环的范围并消除数组边界检查; by的“ masked index”变体索引实际上等于,但是通过AND-mas

  • 我已经阅读了以前关于这个问题的线程,但答案无法解决我的问题。我有一个BroadcastRecencer,它是Mainactive内部的一个内部类,但出现以下异常时失败: hread.java:5118RuntimeException:无法实例化接收器java.lang.reflect.Mainactive$数据库广播接收器:ethod.invoke实例化异常:无法实例化类java.lang.ref