如果interface
没有构造函数,那么这段代码是如何编译的?
interface I {
List<Integer> LIST = Arrays.asList(1, 2, 3);
}
谁在这里初始化List
?
答案 0 :(得分:6)
接口真的没有构造函数吗?
是。它们无法实例化。
谁在这里初始化LIST?
接口的隐式静态初始化程序...在任何东西之前调用一次可以使用LIST
对象 1 。
接口声明的字段是隐式public
,static
和final
(JLS 9.3),任何初始化都是由接口的静态初始化执行的({{3} } / JLS 9.3.1)。
1 - 实际上,这并非严格正确。在正确初始化之前,可以编写一个使用静态字段的程序。 (细节在JLS中。)但它需要做一些......而你不应该......
答案 1 :(得分:1)
接口没有任何构造函数。事情
interface I {
List<Integer> LIST = Arrays.asList(1, 2, 3);
}
编译并运行,因为LIST
是接口的变量,可用于实现I
的所有类。接口可以被认为是具有相同数据字段和方法的类的通用原型,即除了变量之外,所有实现者都需要实现它们。
当VM
加载实现接口的类时,变量被初始化。
答案 2 :(得分:0)
在接口中声明的每个实例成员都是静态的。因此,LIST
是静态的,最终的和公开的。
因此,当您想要从名为LIST
的界面访问 I 成员时,您可以使用:LIST.I
但由于封装,您不希望公共成员不是最终成员。 通常,这些静态最终成员到该类型的特定实例。 引用形状的类型将具有圆形或方形的最终静态实例。
例如:
Class shape {
public final shape Circle;
public shape();
void setX() {};
void getX() { return x;}
}
查看java.lang.Long
,其中包含 MIN_VALUE 和 MAX_VALUE 的实例。
面向对象编程需要使用getX()
和setX()
函数来维护封装。
答案 3 :(得分:-1)
Java定义的接口是静态, public 和 final 。
如果没有在 {和} 对之间提供实现,则无法实例化接口。
new InterfaceA() { int getA() { blah...;return x} };