你真的了解接口的方方面面么?我看未必,看了thinking in JAVA你就知道自己的浅薄了。
首先,我们研究如何写一个interface,inteface前不加public表示的是包权限,加上public就可被公开访问。在一个文件中写多个public interface是错误的,只能
写一个public的,其他的只能为包访问权限。
再写interface的域,域会被自动地添加上public static final 限定,当然,这边的public域只有在interface被声明为public时才能被包外的类访问到。
那么这个域何时被初始化呢?
任何时候,当我们的代码中首次使用到了这个接口时,JVM就会去加载这个接口,就跟加载类是一样的,然后它的域变量就会被初始化。
注意这个域必须在接口中被显式赋值 ,因为接口中不能写静态代码块,并且JVM不会给他默认初值 。
另外,这些域变量是静态绑定的,也就是在编译时就跟该接口进行了绑定,有一个有趣的例子
jse5之前没有enum,所以设计了这个域来记录常量。现在这个域基本就没啥作用了。effective java第19条,不要使用常量接口,因为它一旦被某个类实现,这些常量就侵入
了这个类。除非这个常量真的跟此接口紧密相关,不然的话应该定义成枚举,或者使用不可实例化的工具类来导出这些常量。