1.JDK7及其之前,接口中都是抽象方法,且不能出现static方法
2.接口的变量都是public final static 全局静态常量,无变化
3.接口中可以添加非抽象方法(static),通过接口名调用,不能使用实现类的对象名调用
4.接口中可以添加非抽象方法(非static),需使用default定义。 实现类可以直接使用default方法,可以重写default方法,但是必须去掉default(default只能接口中使用)
5.上级接口中default方法的调用:MyInterface.super.method2();
6.目的是为了既有的成千上万的Java类库的类增加新的功能, 且不必对这些类重新进行设计。
比如, 只需在Collection接口中增加default Stream<E> stream(),相应的Set和List接口以及它们的子类都包含此的方法, 不必为每个子类都重新copy这个方法。但是如果父类、多个接口都同名default、static方法可怎么办呢?有优先顺序和解决之道或者是为了解决实现该接口的子类代码重复的问题
public interface MyInterface { //不能出现static方法 //public static abstract void method1(); //抽象方法,之前就支持 void method1(); // static void method2(){ System.out.println("JDK8后接口中可以有static修饰的非抽象方法"); } //private protected public public default void method3(){ System.out.println("JDK8后接口中可以有非static的非抽象方法,必须添加default"); System.out.println("这个default可不是switch的default,也不是默认权限修饰符"); } public default void method3(String name){ method3(); System.out.println(name); } public static void main(String[] args) { MyInterface.method2(); } }
public class MyClass implements MyInterface{ @Override public void method1() { System.out.println("MyClass method1"); } //接口中的default方法,子类可以直接调用,也可以重写,但是必须去掉default //default是接口中专用的 @Override public void method3() { MyInterface.super.method3();//!!! 如何调用接口的default方法 } public static void main(String[] args) { MyInterface myClass = new MyClass(); //myClass.method1(); //myClass.method3(); myClass.method3("abc");//default方法只能通过对象名调用 //myClass.method2();//static MyInterface.method2();//静态方法只能通过接口名调用 //因为一个类可能实现多个接口,万一多个接口中都有static的且非抽象的method2 } }