2020/7/4 繼承
一、繼承
1、繼承的概念:在程式中,繼承描述的是事物之間的所屬關係,通過繼承可以使多種事物之間形成一種關係體系。
例如公司中的研發部員工和維護部員工都屬於員工,程式中便可以描述為研發部員工和維護部員工繼承自員工,
同理,JavaEE工程師和Android工程師繼承自研發部員工,而網路維護工程師和硬體維護工程師繼承自維護部員工。
這些員工之間會形成一個繼承體系,具體如下圖所示:
在Java中,類的繼承是指在一個現有類的基礎上去構建一個新的類,構建出來的新類被稱作子類,
現有類被稱作父類,子類會自動擁有父類所有可繼承的屬性和方法。
2、繼承的格式和使用
格式:class 子類 extends 父類 {}
/* * 定義員工類Employee */ class Employee { String name; // 定義name屬性 // 定義員工的工作方法 public void work() { System.out.println("盡心盡力地工作"); } } /* * 定義研發部員工類Developer 繼承 員工類Employee */ class Developer extends Employee { // 定義一個列印name的方法 publicvoid printName() { System.out.println("name=" + name); } } /* * 定義測試類 */ public class Example01 { public static void main(String[] args) { Developer d = new Developer(); // 建立一個研發部員工類物件 d.name = "小明"; // 為該員工類的name屬性進行賦值 d.printName(); // 呼叫該員工的printName()方法 d.work(); //呼叫Developer類繼承來的work()方法 } }
3、繼承的好處&注意事項
繼承的好處:
1、繼承的出現提高了程式碼的複用性,提高軟體開發效率。
2、繼承的出現讓類與類之間產生了關係,提供了多型的前提。
在類的繼承中,需要注意一些問題,具體如下:
1、在Java中,類只支援單繼承,不允許多繼承,也就是說一個類只能有一個直接父類,例如下面這種情況是不合法的。
class A{}
class B{}
class C extends A,B{} // C類不可以同時繼承A類和B類
2、多個類可以繼承一個父類,例如下面這種情況是允許的。
class A{}
class B extends A{}
class C extends A{} // 類B和類C都可以繼承類A
3、在Java中,多層繼承是可以的,即一個類的父類可以再去繼承另外的父類,
例如C類繼承自B類,而B類又可以去繼承A類,這時,C類也可稱作A類的子類。下面這種情況是允許的。
class A{}
class B extends A{} // 類B繼承類A,類B是類A的子類
class C extends B{} // 類C繼承類B,類C是類B的子類,同時也是類A的子類
4、在Java中,子類和父類是一種相對概念,也就是說一個類是某個類父類的同時,也可以是另一個類的子類。
例如上面的這種情況中,B類是A類的子類,同時又是C類的父類。
4、繼承-子父類中成員方法特點-重寫&應用
子父類中成員方法的特點:
當在程式中通過物件呼叫方法時,會先在子類中查詢有沒有對應的方法,若子類中存在就會執行子類中的方法,若子類中不存在就會執行父類中相應的方法。
5、方法重寫的注意事項
重寫需要注意的細節問題:
子類方法覆蓋父類方法,必須要保證許可權大於等於父類許可權。
class Fu(){ void show(){} public void method(){} } class Zi extends Fu{ public void show(){} //編譯執行沒問題 void method(){} //編譯錯誤 }
寫法上稍微注意:必須一模一樣:方法的返回值型別 方法名 引數列表都要一樣。
總結:當一個類是另一個類中的一種時,可以通過繼承,來繼承屬性與功能。如果父類具備的功能內容需要子類特殊定義時,進行方法重寫。
class Fu{ public void show(){ System.out.println("Fu類中的show方法執行"); } } class Zi extends Fu{ public void show2(){ System.out.println("Zi類中的show2方法執行"); } } public class Test{ public static void main(String[] args) { Zi z = new Zi(); z.show(); //子類中沒有show方法,但是可以找到父類方法去執行 z.show2(); } }
成員方法特殊情況——覆蓋:
子類中出現與父類一模一樣的方法時,會出現覆蓋操作,也稱為override重寫、複寫或者覆蓋。
class Fu { public void show() { System.out.println("Fu show"); } } class Zi extends Fu { //子類複寫了父類的show方法 public void show() { System.out.println("Zi show"); } }
方法重寫(覆蓋)的應用:
當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容。