繼承:方法重寫、關鍵字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