在Java中,接口是一组方法的集合,那么接口可不可以有属性呢?
答案是可以,接口可以存在属性,但是这个属性必须是一个public static final的常量。
public interface Alcoholic extends Drinker {
boolean READY_TO_GO_HOME = false; //public static final被省略
void sleepOnTheFloor();
}
在这段代码中,READY_TO_GO_HOME 为一个初始化好的常量,它不允许被再次赋值。
但是并没有加上public static final的限定条件?这是为什么!
答案是,在java中,如果接口中存在属性,那么这个属性就默认是public static final限定的,
可以省略“public static final”限定条件
我们来看看如下代码,主要是BeerLover 类中对isReadyToGoHome这个函数的实现,
public class Main {
public static void main(String[] args) {
// write your code here
System.out.println("Hello world!");
}
public interface Drinker {
void askForMore(String message);
void sayThankYou();
boolean isReadyToGoHome();
}
public interface Alcoholic extends Drinker {
boolean READY_TO_GO_HOME = false;
void sleepOnTheFloor();
}
public static class BeerLover implements Alcoholic {
public void sleepOnTheFloor(){
}
public void askForMore(String message){
}
public void sayThankYou(){
}
public boolean isReadyToGoHome(){
return READY_TO_GO_HOME;
}
}
}
BeerLover 类中的isReadyToGoHome这个方法返回了READY_TO_GO_HOME这个常量,
那么是不是有一个疑问,这个常量是属于谁?
是BeerLover.READY_TO_GO_HOME 的还是Alcoholic.READY_TO_GO_HOME ?
我们不妨修改代码验证一下,编译通过并没有报错
public boolean isReadyToGoHome(){
return BeerLover.READY_TO_GO_HOME;
}
修改代码,编译也通过并没有报错。
public boolean isReadyToGoHome(){
return Alcoholic.READY_TO_GO_HOME;
}
这里大家看出什么问题没有?
接口中的属性其实已经被实现它的类继承了过来(姑且叫做继承吧),但是由于这个属性其实是一个常量,不论是BeerLover.READY_TO_GO_HOME还是Alcoholic.READY_TO_GO_HOME,都是相等的,
所以用这个常量参与其它计算,不论用哪个都是等价的。
大家可以再想一想,BeerLover.READY_TO_GO_HOME、Alcoholic.READY_TO_GO_HOME它们在内存中的分配是什么样的呢?是不是它们其实就是同一个对象?