1. 程式人生 > >【Java篇03】具體類 & 抽象類 & 介面 —— 繼承extends & 實現Implement小結

【Java篇03】具體類 & 抽象類 & 介面 —— 繼承extends & 實現Implement小結

一、具體類 & 抽象類 $ 介面

從組成上來看:
具體類包含:屬性、構造器、具體方法、初始化塊(靜態語句塊static{ } 、動態語句塊{ })、內部類 ;
抽象類包含:屬性、構造器、具體方法、抽象方法(需要用public abstract修飾);
介面包含:屬性、抽象方法(一般省略public abstract,直接用void);

★ 這部分的知識點和易混淆點小結如下:

  1. 具體類可以繼承(extends)抽象類,抽象類(extends)也可以繼承抽象類;

  2. 介面由具體類實現(Implements),介面中的屬性為全域性變數(final量);

  3. 抽象類不能建立物件,無法例項化;

  4. 抽象類中可以包含抽象方法,但不是必須的

  5. 抽象方法沒有方法體,無法執行;

  6. 子類繼承父類時,可以繼承(除了構造器、靜態屬性、靜態方法)外的所有屬性和方法;

  7. 子類繼承並擁有父類的private屬性和方法,但無法直接呼叫(訪問)
    對於父類的private屬性,子類可以通過set和get方法呼叫;
    對於父類的private方法,子類key通過反射的途徑呼叫;

  8. 子類不能繼承父類的static屬性和方法,但是可以直接通過子類/子類物件,進行呼叫
    子類/子類物件 . 父類的static屬性;
    子類/子類物件 .父類的 static方法;

  9. 父類中的抽象方法,子類中必須重寫;

  10. 父類中的非抽象方法,子類可以重寫也可以不重寫,不重寫也具有,只是隱藏了 ;

  11. 子類中的構造器中預設有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

分析如下:

  1. 首先main方法是入口,先new一個Base( )物件,呼叫Base方法,執行構造器中的方法體method(100),列印輸出base:100

  2. 然後再new一個Sub( )物件,Sub是Base的子類,重寫了父類的method方法,所以在Sub類的程式碼
    Sub(){
    super.method(70);
    }
    之上其實隱藏了一個super( ),即父類的無參構造器;

  3. 首先呼叫super( ),即
    Base(){
    method(100);}
    }在Sub中重寫的method方法,列印輸出sub:100

  4. 最後執行
    Sub(){
    super.method(70);
    },這裡面super是指父類,即在父類中呼叫method方法,列印輸出base:70