今天无意之间看到了一个default关键字, 经过查询, 才发现是JDK 1.8加入的新特性(我TM竟然不知道!)
简单来讲, 就是接口中允许实现方法体了, 如下
public interface IManager { default void printB() { System.out.println("iManager printB"); } } 复制代码
就像Kotlin一样. 哈哈
这个就很好玩了, 我们都知道Java中子类只允许有一个父类, 但是允许实现多个接口
那么肯定会有方法名冲突的问题啊. 具体来讲分为以下情况
public class ManagerFather { public void printB(){ System.out.println("ManagerFather printB"); } } public interface IManager { default void printB() { System.out.println("iManager printB"); } } public class Manager extends ManagerFather implements IManager{ } public class Main { public static void main(String[] args) { Manager manager = new Manager(); manager.printB(); } } 复制代码
猜一下输出是什么?
ManagerFather printB 复制代码
public interface IManager { default void printB() { System.out.println("iManager printB"); } } public interface IManagerV2 { default void printB(){ System.out.println("IManagerV2 printB"); } } public class Manager implements IManager,IManagerV2{ } 复制代码
结果会发现根本编译不过. 除非Manager子类实现printB方法
对了, 子类不允许通过super关键字调用接口中的方法. 这也难怪, 毕竟super指的是父亲.