以前,接口里的方法要求全部是抽象方法,java8以后允許在接口里定義默認方法和類方法。不同的是:默認方法可以通過實現接口的類實例化的對象來調用,而類方法就相對於工具方法了。需要注意的是,此處的靜態方法只能被public修飾(或者省略不寫),不能是private或者protected。
好處:在Java 8 之前,接口不能有靜態方法,因此按照慣例,接口Type 的靜態工廠方法被放一個名為ypes 的不可實例化的伴生類中。例如Java Collections Framework的集合接口有45 個工具實現,分別提供了不可修改的集合、同步集合,等等。幾乎所有這些實現都通過靜態工廠方法在-個不可實例化的類( java . ut il. Collections ) 中導出。所有返回對象的類都是非公有的。現在的Collections Framework API 比導出45 個獨立公有類的那種實現方式要小得多,每種便利實現都對應一個類。這不僅僅是指API 數量上的減少,也是概念意義上的減少:為了使用這個API,用戶必須掌握的概念在數量和難度上都減少了。
interface DemoInterface { default void doSomething() { System.out.println("默認方法-->test1"); } static void test() { System.out.println("這個是一個靜態方法"); } } interface Demo1Interface { default void doSomething() { System.out.println("默認方法-->test2"); } } public class Test implements DemoInterface { public static void main(String[] args) { Test test = new Test(); test.doSomething(); DemoInterface.test(); //NutritionFacts tFacts = new NutritionFacts.Builder(1, 2).calotes(2).build(); } }
/** * * 此類描述的是:實現兩個接口時,並且兩個接口的方法相同時,必須要實現 * * @author: Aarony * @version: 2019年5月24日 上午10:03:45 */ public class Test1 implements DemoInterface, Demo1Interface { public static void main(String[] args) { Test1 test = new Test1(); test.doSomething(); } // 假如下面是Demo1Interface,輸出test2,DemoInterface 輸出test1 @Override public void doSomething() { DemoInterface.super.doSomething(); // Demo1Interface.super.doSomething(); } }