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

时间:2012-12-16 06:28:11

标签: java list interface

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

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

谁在这里初始化List

4 个答案:

答案 0 :(得分:6)

  

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

是。它们无法实例化。

  

谁在这里初始化LIST?

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

接口声明的字段是隐式publicstaticfinalJLS 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} };