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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值