Java程式設計思想——介面(default關鍵字)
阿新 • • 發佈:2018-12-11
今天讀到Java程式設計思想的介面這一章,我用的是jdk1.8,發現Java介面中有default這個關鍵字,馬上上網一查,原來是Java8中的新特性,然後就開始研究一下,寫下一點感悟。
package Dome01; import org.junit.Test; public class Domestically { @Test public void test(){ //1.不能生成一個抽象類的物件 // Gcenr g = new Gcenr(); Dmeno d = new Dmeno(); //11.實現該介面的類,會自動繼承介面中的預設方法(default),如同繼承其他類一樣 // d.dd(); d.qq(); d.ww(); } } //2.如果一個類繼承了一個抽象類,必須把抽象類中的抽象方法重寫 //3.如果子類繼承了抽象類,並沒有把抽象方法重寫成普通方法,那麼子類也是一個抽象類,需要加abstract修飾符 /*6.介面也一樣,需要把所有的抽象方法實現一遍;那麼問題來了:如果抽象類中的抽象方法也存在於介面中,分三種情況; * 一是兩個抽象方法引數值,返回值一樣,那麼就會按照介面來,因為子類實現介面的抽象方法,要大於介面的許可權修飾符,只能是public; * 二是兩個抽象方法返回值不同,引數相同,那麼編譯器就會報錯,因為不知道呼叫哪一個方法來實現;(因為還達不到過載的條件) * 三是兩個抽象方法引數不同,這樣的情況該呼叫誰的方法,就呼叫誰的方法,相當於過載 * */ //12.介面中的static方法的呼叫:介面名.方法名 //14.default,static方法不強制實現,因為已經是一個完整的方法了; // /** * 15.Java8預設方法引出來的問題: * 1.一個類實現了多個介面,而多個介面中都有相同的default方法,又回到6中提到的問題了, * (1).兩個抽象方法引數值,返回值一樣,那麼必須要重寫這個方法,在方法裡面再呼叫各自的方法,呼叫方式為:Ftecr.super.ww(); * (2).兩個抽象方法返回值不同,引數相同,那麼編譯器就會報錯,因為不知道呼叫哪一個方法來實現;(與6 同樣的道理) * (3).兩個抽象方法引數不同,這樣的情況該呼叫誰的方法,就呼叫誰的方法,兩個方法相當於過載 * 2.一個類實現了一個介面,同時繼承了一個抽象類,介面中的default方法同時存在於抽象類中, * 這裡分兩大情況:1.抽象類中的方法沒有實現,是抽象方法,那麼跟上面的一樣; * 2.抽象類中實現了這個方法,這種情況下多出一種 * (1).兩個抽象方法引數值,返回值一樣,不必重寫方法,因為繼承抽象類自帶;相當於重寫 * (2).兩個抽象方法返回值不同,引數相同,那麼編譯器就會報錯,因為不知道呼叫哪一個方法來實現; * (3).兩個抽象方法引數不同,這樣的情況該用誰的方法,就用誰的方法,兩個方法不相同 * (4).兩個抽象方法引數值,返回值一樣,但是抽象類中的實現方法不是public修飾,會報錯,因為對於介面來說修飾許可權不夠 * * 對於static方法,因為呼叫它要用介面名.方法名,所以不存在這種問題 * */ class Dmeno extends Gcenr implements Ftecr,Fteted{ @Override public void f() { // TODO Auto-generated method stub System.out.println("ffffff"); } @Override public void ss() { // TODO Auto-generated method stub } @Override void z() { // TODO Auto-generated method stub }; //7.實現的抽象方法要比介面的抽象方法許可權大,所以要用public; @Override public void jj() { // TODO Auto-generated method stub } @Override public void f(String d) { // TODO Auto-generated method stub } @Override public void ww() { // TODO Auto-generated method stub Ftecr.super.ww(); Fteted.super.ww(); } } //4.抽象類中不一定有抽象方法,但有抽象方法的一定是抽象類; //5.抽象類中可以有普通方法; abstract class Gcenr{ abstract void f(); abstract void z(); void qq(){ System.out.println("qq"); } //這裡用public public void ww1(){ System.out.println("Gcenr-ww"); }; } //介面 interface Ftecr{ abstract void f(String d); abstract void ss(); //8.java8中的新特性,介面可以建立普通方法,但是要用default或者static修飾,而且只能用於介面中; //9.可以有多個default,static修飾的方法; //10.在介面中由default,static修飾的方法必須有完整的實現 //13.default,static修飾的方法相當於一個抽象類了,間接實現多繼承 public default void ww() { System.out.println("Ftecr-ww"); } public default void ww1() { System.out.println("Ftecr-ww1"); } public static void dd(){ } public static void dd1(){ } } interface Fteted{ abstract void jj(); abstract void ss(); public default void ww(){ System.out.println("Fteted-ww"); } public static void dd1(){ } } //介面不能實現介面,但是可以繼承另一個介面,介面的超類只能是介面,類的超類只能是類 interface Fteted01 extends Fteted{ // abstract void jj(); abstract void qss(); // public default void ww(){ // System.out.println("Fteted-ww"); // } }
古人學問無遺力,少壯工夫老始成。 紙上得來終覺淺,絕知此事要躬行。——陸游