C語言中文網 目錄

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

繼承是代碼復用的一種形式,即在具有包含關系的類中,從屬類繼承主類的全部屬性和方法,從而減少了代碼冗余,提高了程序運行效率。例如,一個矩形(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 圖形類之間的關系

從圖 1 中可以看出,三角形、四邊形和五邊形的直接父類是多邊形類,它們的間接父類是圖形類。圖形類、多邊形類和三角形、四邊形、五邊形類形成了一個繼承的分支。在這個分支上,位于下層的子類會繼承上層所有直接或間接父類的屬性和方法。如果兩個類不在同一個繼承樹分支上,就不會存在繼承關系,例如多邊形類和直線。

提示:間接的繼承關系就是分別繼承、實現,例如:class Graph extends Polygon{…}、class Trigon extends Graph{…}。如果類聲明頭部沒有定義任何 extends 子句,則該類隱含地繼承自 java.lang.Object 類。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo