原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/11/25/2788247.html
繼承介紹
在java語言中,類可以從其他類繼承而來,並繼承父類的成員和方法。
繼承是簡單但是非常強大:當你需要建立一個新類,但是已經有其他類,它已經包含了一些你需要的代碼,那麼你可以從已有的這個類,繼承新的類。這樣,你不用寫重複的代碼和調試,就可以重用已有類的成員和方法。
子類從父類繼承所有的成員(變數,方法和內部類),構造方法不是成員,所以不會被繼承,但是子類的構造方法可以調用父類的構造方法。
在java平台中,java.lang.Object是所有類的父類,有些類直接繼承Object,有些類間繼承其他類,其他類繼承自Object。
繼承例子
Bicycle類
public class Bicycle { // the Bicycle class has // three fields public int cadence; public int gear; public int speed; // the Bicycle class has // one constructor public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } // the Bicycle class has // four methods public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; } }
一個類MountainBike
類繼承自Bicycle:
public class MountainBike extends Bicycle { // the MountainBike subclass adds // one field public int seatHeight; // the MountainBike subclass has one // constructor public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) { super(startCadence, startSpeed, startGear); seatHeight = startHeight; } // the MountainBike subclass adds // one method public void setHeight(int newValue) { seatHeight = newValue; } }
MountainBike
繼承Bicycle的所有變數和方法,並添加了seatHeight變數和對應的set方法。MountainBike
新類,它有四個變數和五個方法,不過你未必要全部都要使用。
如果Bicycle的方法很複雜,並已經使用了大量的時間調試,那麼這種複用代碼的方式,是相當簡單並有價值。
子類能做的事情
子類繼承父類所有的public和protected成員,不管父類在哪個包。如果子類和父類在同一個包,它也會繼承父類的package-private成員(沒有修飾public,privat,protected的成員),對於繼承的成員,可以替換它,隱藏它,或者補充新成員:
1.被繼承的成員變數可以直接使用,就像使用其他成員
2.聲明一個新成員變數,名字和父類的成員變數名字一樣,就隱藏了該成員(不推薦)
3.聲明不存在父類的新成員變數。
4.繼承的方法可以直接使用
5.在子類實現一個與父類簽名一樣的方法,可以覆蓋父類的方法。
6.在子類實現一個與父類簽名一樣的新的static方法,可以覆蓋父類的方法。
7.可以聲明一個不存在父類的新成員方法。
8.實現一個子類的構造器,通過隱式或者顯示使用super調用父類的構造器。
父類的private成員
子類不會繼承父類的private成員,但是,如果父類已經有public或protected方法訪問的私人成員,那麼通過可以繼承的方法,依然可以間接訪問父類的private成員.
內部類可以訪問嵌套類的所有成員,包括嵌套類private成員。
對象轉換
一個對象的執行個體化,我們可能這麼寫:
public MountainBike myBike = new MountainBike();
這表示myBike是MountainBike類型。
MountainBike
派生自Bicycle
和Object,所以,一個MountainBike執行個體既是一個Bicycle,也是一個Object.
而逆轉的未必是可以的:一個Bicycle未必是MountainBike。同樣的,一個Object未必是Bicycle
或者MountainBike。
類型轉換顯示在允許的繼承和實現中,一個對象,從一種類型替換為另一種類型的用法.例如
Object obj = new MountainBike();
這樣obj既是一個Object,也是一個Mountainbike。
另一邊,我們這麼寫:
MountainBike myBike = obj;
我們會遇到一個編譯時間錯誤,因為對於obj,編譯器不知道它是一個MountainBike。儘管如此,我們可以告訴編譯器,通過顯示轉換,將obj轉換為類型MountainBike
MountainBike myBike = (MountainBike)obj;
這種轉換為插入一個運行時檢測,編譯器會安全假設obj是一個MountainBike類型,但如果obj不是一個MountainBike,運行時,會拋出異常。
當然,你可以使用instanceof操作符做邏輯測試,判斷obj是否MountainBike類型再做轉換
if (obj instanceof MountainBike) { MountainBike myBike = (MountainBike)obj;}
這樣,我們做類型轉換,就不會有運行時異常拋出了。