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 } }