繼承是程式碼複用的一種形式,即在具有包含關係的類中,從屬類繼承主類的全部屬性和方法,從而減少了程式碼冗餘,提高了程式執行效率。例如,一個矩形(Rectangle類)屬於四邊形(Quadrilateral),正方形、平行四邊形和梯形同樣都屬於四邊形。從類的角度來解釋,可以說成 Rectangle 類是從 Quadrilateral 類繼承而來的,其中 Quadrilateral 類是基礎類別,Rectangle 類是派生類。
簡單繼承
Java 中類的繼承是通過擴充套件其他類而形成新類來實現的,原來的類稱為
父類別(super class)或基礎類別,新類稱為原來類的
子類或派生類。在子類中,不僅包含父類別的屬性和方法,還可以增加新的屬性和方法,使得父類別的基本特徵可被所有子類的物件共用。
注意:類的繼承並不改變類成員的存取許可權。也就是說,如果父類別的成員是公有的、被保護的或預設的,它的子類仍具有相應的這些特性。
類繼承的定義格式如下:
class class_name extends extend_class
{
//類的主體
}
其中,class_name 表示子類(派生類)的名稱;extend_class 表示父類別(基礎類別)的名稱;
extends 關鍵字直接跟在子類名之後,其後面是該類要繼承的父類別名稱。例如:
public class Student extends Person{}
例 1
教師類和學生類可以由人類派生,他們具有共同的屬性:姓名、年齡、性別、身份證號,而學生還具有學生號和所學專業兩個屬性,教師還具有教齡和所教專業兩個屬性。下面編寫 Java 程式程式碼,使教師類和學生類都繼承於人類,具體的實現步驟如下。
(1) 建立人類 People,並定義 name、age、sex、sn 屬性,程式碼如下:
public class People
{
public String name; //姓名
public int age; //年齡
public String sex; //性別
public String sn; //身份證號
public People(String name,int age,String sex,String sn)
{
this.name=name;
this.age=age;
this.sex=sex;
this.sn=sn;
}
public String toString()
{
return"姓名:"+name+"n年齡:"+age+"n性別:"+sex+"n身份證號:"+sn;
}
}
如上述程式碼,在 People 類中包含 4 個公有屬性、一個構造方法和一個 toString() 方法。
(2) 建立 People 類的子類 Student 類,並定義 stuNo 和 department 屬性,程式碼如下:
public class Student extends People
{
private String stuNo; //學號
private String department; //所學專業
public Student(String name,int age,String sex,String sn,String stuno,String department)
{
super(name,age,sex,sn); //呼叫父類別中的構造方法
this.stuNo=stuno;
this.department=department;
}
public String toString()
{
return"姓名:"+name+"n年齡:"+age+"n性別:"+sex+"n身份證號:"+sn+"n學號:"+stuNo+"n所學專業:"+department;
}
}
由於 Student 類繼承自 People 類,因此,在 Student 類中同樣具有 People 類的屬性和方法,這裡重寫了父類別中的 toString() 方法。
注意:如果在父類別中存在有參的構造方法而並沒有過載無參的構造方法,那麼在子類中必須含有有參的構造方法,因為如果在子類中不含有構造方法,預設會呼叫父類別中無參的構造方法,而在父類別中並沒有無參的構造方法,因此會出錯。
(3) 建立 People 類的另一個子類 Teacher,並定義 tYear 和 tDept 屬性,程式碼如下:
public class Teacher extends People
{
private int tYear; //教齡
private String tDept; //所教專業
public Teacher(String name,int age,String sex,String sn,int tYear,String tDept)
{
super(name,age,sex,sn); //呼叫父類別中的構造方法
this.tYear=tYear;
this.tDept=tDept;
}
public String toString()
{
return"姓名:"+name+"n年齡:"+age+"n性別:"+sex+"n身份證號:"+sn+"n教齡:"+tYear+"n所教專業:"+tDept;
}
}
Teacher 類與 Student 類相似,同樣重寫了父類別中的 toString() 方法。
(4) 編寫測試類 PeopleTest,在該類中建立 People 類的不同物件,分別呼叫它們的 toString() 方法,輸出不同的資訊。具體的程式碼如下:
public class PeopleTest
{
public static void main(String[] args)
{
//建立Student類物件
People stuPeople=new Student("王麗麗",23,"女","410521198902145589","00001","計算機應用與技術");
System.out.println("----------------學生資訊---------------------");
System.out.println(stuPeople);
//建立Teacher類物件
People teaPeople=new Teacher("張文",30,"男","410521198203128847",5,"計算機應用與技術");
System.out.println("----------------教師資訊----------------------");
System.out.println(teaPeople);
}
}
執行程式,輸出的結果如下:
----------------學生資訊---------------------
姓名:王麗麗
年齡:23
性別:女
身份證號:410521198902145589
學號:00001
所學專業:計算機應用與技術
----------------教師資訊----------------------
姓名:張文
年齡:30
性別:男
身份證號:410521198203128847
教齡:5
所教專業:計算機應用與技術
單繼承
Java 不支援多繼承,只允許一個類直接繼承另一個類,即子類只能有一個父類別,extends 關鍵字後面只能有一個類名。例如,如下程式碼會導致編譯錯誤:
class Student extends Person,Person1,Person2{…}
class Student extends Person,extends Person1,extends Person2{…}
儘管一個類只能有一個直接的父類別,但是它可以有多個間接的父類別。例如,Student 類繼承 Person 類,Person 類繼承 Person1 類,Person1 類繼承 Person2 類,那麼 Person1 和 Person2 類是 Student 類的間接父類別。圖 1 展示了單繼承的關係。
圖1 圖形類之間的關係