Java類的繼承:Java簡單的繼承及單繼承和多繼承的區別

2020-07-16 10:04:36
繼承是程式碼複用的一種形式,即在具有包含關係的類中,從屬類繼承主類的全部屬性和方法,從而減少了程式碼冗餘,提高了程式執行效率。例如,一個矩形(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 圖形類之間的關係