【Java】为什么接⼝interface⾥的变量是staticfinal的?
今天突然问⾃⼰,接⼝的变量为什么是static和final的?
static:必须。因为接⼝是可以多继承的。如果⼀个类实现了两个接⼝,且两个接⼝都具有相同名字的变量,此时这个变量可以被实现类使⽤,那么如果不是static的,这个变量来⾃哪⼀个接⼝就会产⽣歧义,所以实现类使⽤接⼝中的变量必须通过接⼝名指定,也就只能定为static的。
看下⾯的例⼦:
public interface iface1 {
static修饰的变量int a = 10;
}
public interface iface2 {
int a = 9;
}
public class impl implements iface1, iface2 {
public static void main(String args[]){
System.out.println(a);
}
}
此时,会报编译错误,因为a有歧义。
Reference to 'a' is ambiguous, both 'iface1.a' and 'iface2.a' match
final:我认为因为必须是static的,那么所有⼦类共享,⽽接⼝是⼀种抽象, 所以⼀个⼦类修改了值会影响到其他所有⼦类,因此就不应该允许⼦类修改这个值,所以定义为final。
到⽬前为⽌,我还没有发现⼀个接⼝需要定义常量,不知道为什么java设计的时候会允许interface有域。
当然有⼈会使⽤interface封装常量,这个在effective java中被认为是对接⼝的误⽤,主要是因为会污染
导出接⼝列表,同时污染⼦类命名空间。
我个⼈觉得,java设计者并不想把设计做的那么绝,从语⾔⾓度禁⽌在interface⾥定义变量,它给了程序员这个空间,只是说在后续的发展中,经过实践的检验发现这种定义常量在接⼝种的⽅法并不好,所以我们尽量不这么做了。设计者把这个留给了程序员来把控。
我认为可以不像effective java⾥所说,禁⽌在interface⾥放常量。但是interface必须专⼀,即要在interface⾥放常量,那么该interface 就只能当做常量库来使⽤,不应该再提供任何抽象或者被类实现,否则就会出现effective java⾥所说的问题。如果该interface是⼀个为了抽象的接⼝,那么它⾥⾯就不应该定义常量,应该在另⼀个类⾥⾯封装所有常量,只能⼆选⼀。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论