【Java篇03】具體類 & 抽象類 & 介面 —— 繼承extends & 實現Implement小結
一、具體類 & 抽象類 $ 介面
從組成上來看:
具體類包含:屬性、構造器、具體方法、初始化塊(靜態語句塊static{ } 、動態語句塊{ })、內部類 ;
抽象類包含:屬性、構造器、具體方法、抽象方法(需要用public abstract修飾);
介面包含:屬性、抽象方法(一般省略public abstract,直接用void);
★ 這部分的知識點和易混淆點小結如下:
-
具體類可以繼承(extends)抽象類,抽象類(extends)也可以繼承抽象類;
-
介面由具體類實現(Implements),介面中的屬性為全域性變數(final量);
-
抽象類不能建立物件,無法例項化;
-
抽象類中可以包含抽象方法,但不是必須的;
-
抽象方法沒有方法體,無法執行;
-
子類繼承父類時,可以繼承(除了構造器、靜態屬性、靜態方法)外的所有屬性和方法;
-
子類繼承並擁有父類的private屬性和方法,但無法直接呼叫(訪問);
對於父類的private屬性,子類可以通過set和get方法呼叫;
對於父類的private方法,子類key通過反射的途徑呼叫; -
子類不能繼承父類的static屬性和方法,但是可以直接通過子類/子類物件,進行呼叫;
子類/子類物件 . 父類的static屬性;
子類/子類物件 .父類的 static方法; -
父類中的抽象方法,子類中必須重寫;
-
父類中的非抽象方法,子類可以重寫也可以不重寫,不重寫也具有,只是隱藏了 ;
-
子類中的構造器中預設有super( ),很多時候隱藏了,但是編譯的時候是預設其存在的;例如下面的程式碼題
public class Test { public static void main(String[] args) { Base b1 = new Base(); Base b2 = new Sub(); } } class Base{ Base(){ method(100); } public void method(int i){ System.out.println("base : " + i); } } class Sub extends Base{ Sub(){ super.method(70); } public void method(int j){ System.out.println("sub : " + j); } }
列印結果是:
base : 100
sub : 100
base : 70
分析如下:
-
首先main方法是入口,先new一個Base( )物件,呼叫Base方法,執行構造器中的方法體method(100),列印輸出base:100;
-
然後再new一個Sub( )物件,Sub是Base的子類,重寫了父類的method方法,所以在Sub類的程式碼
Sub(){
super.method(70);
}
之上其實隱藏了一個super( ),即父類的無參構造器; -
首先呼叫super( ),即
Base(){
method(100);}
}在Sub中重寫的method方法,列印輸出sub:100; -
最後執行
Sub(){
super.method(70);
},這裡面super是指父類,即在父類中呼叫method方法,列印輸出base:70。