1. 程式人生 > >JavaSE基礎之繼承

JavaSE基礎之繼承

無法 rec true 屬性綁定 idt 而在 span 同名 rect

一.概念

父子概念的繼承:圓繼承於圖形,圓是子概念(子類型 Sub class)圖形是父類型(Super Class也叫超類),繼承在語法方面的好處:子類共享了父類的屬性和方法的定義,子類復用了父類的屬性和方法,節省了代碼。

1)繼承是is a :“是”我中的一種,一種所屬關系。

2)子類型對象可以賦值給父類型變量(多態的一種形式),變量是代詞,父類型代詞可以引用子類型東西。

3)繼承只能是單繼承,即直接繼承,而非間接繼承。因為多繼承容易帶來安全隱患,當多個父類中定義了相同功能,當功能內容不同時,子類無法確定要運行哪一個。

4)父類不能強轉成子類,會造型異常!子類向父類轉化是隱式的。

5)只有變量的類型定義的屬性和方法才能被訪問!見下例。

6)重寫遵循所謂“運行期綁定”,即在運行的時候根據引用變量指向的實際對象類型調用方法。

7)引用類型變量的類型轉換 instanceof

public static void main(String[] args) {
        Circle c = new Circle(3,4,5);        
Rect r = new Rect(3,4,5,6); Shape s = c;
Shape s1 = r; //Circle x = s;//編譯錯誤,父類型變量不能賦值給子類型
Circle x = (Circle)s;//正常執行 //Circle y = (Circle)s1;//運行異常,類型轉換異常 //instaceof instace:實例 of:的 //instaceof 運算 檢查變量引用的對象的類型是否兼容 //s引用的是圓對象,s instanceof Circle 檢查s引用的對象是否是Circle類型的實例! System.out.println(s instanceof Circle);//true System.out.println(s1 instanceof
Circle);//false test(c);
test(r);
}
public static void test(Shape s){//多態的參數 //if(s instanceof Circle)保護了(Circle)s不會出現異常 if(s instanceof Circle){//實現了安全的類型轉換 Circle c = (Circle) s;
System.out.println("這是一個圓, 面積"+c.area());
}
if(s instanceof Rect){ Rect r = (Rect) s;
System.out.println("這是一個矩形, 面積"+r.area());
}
}

8)繼承時候對象的創建過程

①Java首先遞歸加載所有類搭配方法區。②分配父子類型的內存(實例變量)。③遞歸調用構造器。

技術分享圖片

9)重寫方法與重載方法的調用規則

技術分享圖片

10)屬性綁定到變量的類型,由變量類型決定訪問哪個屬性;方法動態綁定到對象,由對象的類型決定訪問哪個方法。(強轉對方法動態綁定到對象無影響,因為強轉的是父類的引用,而實例是沒變的,只是把實例當作另一個狀態去看而已。但是強轉對屬性動態綁定到變量類型有影響。

技術分享圖片

eg1:方法動態綁定到運行期間對象的方法 實例1

技術分享圖片

eg2:方法動態綁定到運行期間對象的方法 實例2

技術分享圖片

11)為何查閱父類功能,創建子類對象使用功能?

Java中支持多層繼承,也就是一個繼承體系。想要使用體系,先查閱父類的描述,因為父類中定義的是該體系中共性的功能,通過了共性功能,就可以知道該體系的基本功能,那麽這個體系已經可以基本使用了,然而在具體調用時,要創建最(低)子類的對象,原因如下:①因為父類有可能不能創建對象②創建子類對象,可以使用更多的功能,包括基本的也包括特有的。

12)屬性無繼承概念,所以你有你的,我有我的,各自調用各自的,不影響,即使子父類中有同名屬性也無影響。

JavaSE基礎之繼承