java接口里面可以定义变量么?

答案是:可以,但必须是public static final的

既然JDK1.7开始支持接口中存在default方法和static方法,那么这些方法在实现上,难免需要一些变量提供数据支持。
先看一个例子:

//基于JDK1.8
//IA.java
public interface IA {
    int a = 100;
    double NUM = 1;//等价于public static final double NUM = 1;
    String name = "IA";

    void say();
    default void print() {
        System.out.println("IA:print()");
    }
    default void pritA() {
        System.out.println("IA: " + name);
    }
}

//IB.java
public interface IB {
    int b = 200;
    double NUM = 2;
    String name = "IB";

    void say();
    default void print() {
        System.out.println("IB:print()");
    }
    default void pritB() {
        System.out.println("IB: " + name);
    }
}

//AB.java
public class AB implements IA, IB {
    public static void main(String[] args) {
        AB ab = new AB();
        //ab.name 报错,不能确定是IA中的name还是IB中的
        System.out.println(a);//100  因为a和b本质上是静态成员,在静态方法里面可以直接访问
        System.out.println(b);//200
        System.out.println(IA.NUM);//1.0
        System.out.println(IB.NUM);//2.0
        System.out.println(IA.name);//IA
        System.out.println(IB.name);//IB
        ab.say();//AB:say()
        ab.print();//AB:print()
        ab.pritA();//IA: IA
        ab.pritB();//IB: IB
    }

    //必须实现接口中未实现的方法,并且根据排序规则,实现的是IA中的say()
    @Override
    public void say() {
        System.out.println("AB:say()");
    }

    //必须重写IA和IB中重复(签名相同)的default方法,否则调用print时不知道调用IA中的实现,还是IB中的。
    @Override
    public void print() {
        System.out.println("AB:print()");
    }
}

据此得出结论:

  1. 接口中的成员变量默认且只能是public static final的,加这几个访问修饰符是多余的。
  2. 接口中的成员变量在实现类中可以直接访问(不管是静态方法还是非静态方法),如果父接口中有重复出现的成员变量,则只能带上接口名加以区分。
  3. 接口中default修饰的方法,为子类提供默认实现。
  4. 子类实现多个接口,多个接口中有同样签名的方法时,根据排序规则,以写在前面的接口为准。如果父接口中的default方法有重复,则子类必须重写此方法(不然,多个接口中分别提供了各自的实现,子类会不知道调用哪一个)。
  • 26
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Java接口中不能有实例变量,只能有常量。因为接口中的变量默认是public static final类型的,也就是常量,它们的值在定义时就已经确定,不能被修改。 但是从Java 8开始,接口中可以定义default方法和static方法default方法接口中带有方法体的方法,它可以被实现类继承或覆盖。static方法接口中带有static关键字的方法,它可以直接通过接口名来调用,而不需要创建实例对象。 在Java 9中,接口还可以定义私有方法,这些方法只能在接口中被调用,不能被实现类或其他类调用。 下面是一个Java 8中带有default方法和static方法接口的例子: ``` public interface Animal { int MAX_AGE = 100; void eat(); default void sleep() { System.out.println("动物睡觉"); } static void run() { System.out.println("动物奔跑"); } } public class Dog implements Animal { public void eat() { System.out.println("狗吃骨头"); } } public class Test { public static void main(String[] args) { System.out.println(Animal.MAX_AGE); // 100 Dog dog = new Dog(); dog.eat(); // 狗吃骨头 dog.sleep(); // 动物睡觉 Animal.run(); // 动物奔跑 } } ``` 在上面的例子中,Animal接口定义了一个常量MAX_AGE和三个方法eat、sleep和run。eat方法必须被实现实现,sleep方法有默认实现,而run方法是静态方法,可以直接通过接口名来调用。Dog类实现了Animal接口,并实现了eat方法。在测试类Test中,通过Animal接口的常量MAX_AGE来获取狗的最大年龄,通过Dog类的实例对象dog来调用eat和sleep方法,通过Animal接口的静态方法run来调用动物奔跑方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值