接口就是提供一种统一的”协议”,而接口中的属性也属于“协议”中的成员。它们是公共的,静态的,最终的常量。相当于全局常量。抽象类是不“完全”的类,相当于是接口和具体类的一个中间层。即满足接口的抽象,也满足具体的实现。
接口最重要的功能就是起到规范作用,比抽象类更抽象。Java接口中不允许定义变量(不包括静态变量)的原因如下:
接口的规范性以及抽象性,决定了变量在实现接口的类中实现。如果接口可以定义变量,假设接口 A 中有一个public 访问权限的静态变量 a。按照 Java 的语义,我们可以不通过实现接口的对象来访问变量 a,通过 A.a = xxx; 就可以改变接口中的变量 a 的值了。正如抽象类中是可以这样做的,那么实现接口 A 的所有对象也都会自动拥有这一改变后的 a 的值了,也就是说一个地方改变了 a,所有这些对象中 a 的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?同时,在接口中定义变量,也就同时将变量的类型确定下来,进而要求相关的具体方法,与抽象思想相抵触。
所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。