繼承:方法重寫、關鍵字super與物件實例化過程
尚硅谷JavaSE筆記-12
繼承
目的
- 減少代碼冗餘、提高復用性
- 便於功能擴展
- 為多態鋪路
格式
class A extends B{} // A延展了B
A:子類、派生類、subclass
B:父類、超類、基類、superclass
繪圖時,通常用空心箭頭從子指向父,例如:Student→Person,表示學生類繼承了人類
特性
- A繼承B之後,子類A就獲取了B聲明的所有屬性與方法,包含了私有(private)的,但是由於封裝性的影響,子類無法直接調用父類私有(private)的屬性與方法
- 不允許多重繼承(一人只能有一個老爸)
- 可以多層繼承(允許有孫子,孫子也會繼承爺爺的特性)
- 一個父類可以有多個子類(允許家族開枝散葉)
- 所有類都繼承自
java.lang.Object
,換言之所有類都具有Object類
的特性
權限修飾符protected的應用
- 之前提過
protected
的範圍是不同包的子類也能用,就是應在這了- 實際發開中用的比較少一點
方法的重寫
-
子類繼承父類後,對父類同名同參數的方法,進行覆蓋
-
子類重寫的方法權限修飾符必須不小於父類被重寫的方法
- 白話:不能把公車私有化,權限範圍不能縮小
- 注意:不能重寫父類中聲明為
private
的方法(本身就見不到),可以在子類中硬寫一個同名的方法,但那就不是構成重寫
-
若父類被重寫的方法返回值是
void
,子類重寫的方法也必須返回void
-
若父類被重寫的方法返回值是A類型,子類重寫的方法返回值可以是A類或A類的子類
- 舉例:父類返回值是動物類,子類可以重寫返回動物類或貓類狗類
-
若父類被重寫的方法返回值是基本數據類型,子類重寫的方法返回值必須是相同基本數據類
- 舉例:父類返回
double
子類也必須是double
,不能是int
期待他自動類型提升
- 舉例:父類返回
-
拋出異常(
throws
)的規則與返回值相同 -
以上白話小結:權限不能小於爸爸、返回值不能大於爸爸
-
補充:子類與父類同名同參數的方法要嘛都聲明為非
static
的(考慮重寫),要嘛都聲明為static
的(不是重寫,靜態類的方法不能被覆蓋)
關鍵字super
用來表示父類中的屬性、方法、構造器
調用屬性與方法
- 可以在子類的方法或構造中,用"
super.方法
“或”super.屬性
“來顯式調用父類中聲明的屬性或方法 - 就近原則,比如有人很欠揍的在A01類A02類A03類三代中都命名了同為
id
的屬性,我在A03調super.id
會調到A02的id
- 方法則基本上就是用來區分重寫的子類方法,跟原先父類的同名方法
super
不能突破封裝性的限制
調用構造器
-
在子類的構造器中,顯示使用”
super(形參列表)
“顯式調用父類中聲明的指定構造器 -
“
super(形參列表)
“必須聲明在子類構造器的首行- 意味著”
super(形參列表)
“與”this(形參列表)
“只能二選一
- 意味著”
-
若沒寫則首行預設是一個”
super()
”- 意味著子類構造器中必定至少存在一個構造器來自於父類
- 要是在父類中的空參構造器寫了某個特徵,那他所有往下的子類都帶有這個特徵
子類物件實例化的過程
從結果上來看
- 子類繼承父類後,就獲取了父類聲明的屬性或方法
- 創建子類的物件,在堆空間中就會加載所有父類中聲明的屬性
從過程上來看
- 當創建子類的物件時,必定會直接或間接的調用其父類的構造器,層層往上直到調用了
java.lang.Object
類中的空參構造器為止,正因為加載過所有父類的結構,所以才可以看到內存中有父類的結構,子類物件才可以考慮進行調用 - 雖然子類創立物件時調用了父類的構造器,但自始至終就只
new
一個子類的物件
上次修改於 2021-11-27