2

如果interface没有构造函数,那么这段代码如何编译?

    interface I {
        List<Integer> LIST = Arrays.asList(1, 2, 3);
    }

谁在这里初始化List

4

4 回答 4

6

接口真的没有构造函数吗?

是的。它们不能被实例化。

谁在这里初始化 LIST?

LIST接口的隐式静态初始化器 ... 在任何东西可以使用对象1之前调用一次。

接口声明的字段是隐式的publicstatic并且finalJLS 9.3)和任何初始化都由接口的静态初始化(JLS 9.3.1 / 12.4.2)执行。


1 - 实际上,这并不完全正确。可以编写一个程序,其中在正确初始化之前使用静态字段。(详细信息在 JLS 中。)但这需要做一些事情......而且你不应该......

于 2012-12-16T06:31:31.577 回答
1

接口没有任何构造函数。事情

interface I {
    List<Integer> LIST = Arrays.asList(1, 2, 3);
}

编译和工作,因为LIST是接口的一个变量,可用于所有实现I. 接口可以被认为是具有相同数据字段和方法的类的通用原型,即除变量外,所有实现者都需要实现它们。

变量在VM加载实现接口的类时被初始化。

于 2012-12-16T06:33:50.080 回答
0

在接口中声明的每个实例成员都是静态的。所以,LIST是静态的、最终的和公开的。

因此,当您想从名为 的接口访问成员ILIST时,可以使用:LIST.I

但是由于封装,您不希望公共成员不是最终的。通常,这些静态最终成员为特定类型的实例。引用形状的 Type 将具有 Circle 或 Square 的最终静态实例。

前任:

Class shape {  
  public final shape Circle;  
  public shape();  
  void setX() {};  
  void getX() { return x;}  
}

java.lang.Long,它有MIN_VALUEMAX_VALUE这样的实例。

面向对象编程需要使用getX()setX()函数来维护封装。

于 2012-12-16T06:34:08.160 回答
-1

Java 定义的接口是静态的、公共的和最终的。

如果不提供一对{ 和 }之间的实现,则无法实例化接口。

new InterfaceA() { int getA() { blah...;return x} };
于 2012-12-16T06:36:27.133 回答