Java 接口是否可以存在属性字段?

  • Post author:
  • Post category:java


在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它们在内存中的分配是什么样的呢?是不是它们其实就是同一个对象?



版权声明:本文为roddger1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。