1. 程式人生 > >Java繼承的概念與實現

Java繼承的概念與實現

繼承是類與類之間的關係,是一個很簡單很直觀的概念,與現實世界中的繼承(例如兒子繼承父親財產)類似。
繼承可以理解為一個類從另一個類獲取方法和屬性的過程。如果類B繼承於類A,那麼B就擁有A的屬性和方法。
繼承使用extends關鍵字。
例如我們已經定義了一個類People:

package jicheng;

class People
{
    String name;
    int age;
    int height;

    void say()
    {
        System.out.println("我的名字是 " + name + ",年齡是 " + age + ",身高是 "
+ height); } }

如果現在需要定義一個類Teacher,它也有name,age,height屬性和say()方法,另外還需要增加school,seniority,subject屬性和lectureing()方法,怎麼辦呢?我們要重新定義一個類嗎?
完全沒有必要,可以先繼承People類的成員,在增加自己的成員即可,例如:

package jicheng;

class Teacher extends People
{
    String school;//所在學校
    String subject;//學科
    int seniority;//教齡

    //覆蓋People類中的say()方法
void say() { System.out.println("我叫" + name + ",在" + school + "教" + subject + ",有" + seniority + "年教齡"); } void lecturing() { System.out.println("我已經" + age + "歲了,依然站在講臺上講課"); } }

對程式的說明
• name 和 age 變數雖然沒有在 Teacher 中定義,但是已在 People 中定義,可以直接拿來用。
• Teacher 是 People 的子類,People 是Teacher 類的父類。
• 子類可以覆蓋父類的方法。
• 子類可以繼承父類除private以為的所有的成員。
• 構造方法不能被繼承。
繼承是在維護和可靠性方面的一個偉大進步。如果在People類中進行修改,那麼Teacher類就會自動修改,而不需要程式設計師做任何工作,除了對它進行編譯。
**單繼承性:**Java允許一個類僅能繼承一個其它類,即一個類只能有一個父類,這個限制被稱為單繼承性。介面允許多繼承。
最後對上面的程式碼進行整理:

package jicheng;

public class Demo
{
    public static void main(String[] args)
    {
        Teacher t = new Teacher();
        t.name = "小布";
        t.age = 70;
        t.school = "清華大學";
        t.subject = "Java";
        t.seniority = 12;
        t.say();
        t.lecturing();
    }
}

class People
{
    String name;
    int age;
    int height;

    void say()
    {
        System.out.println("我的名字是 " + name + ",年齡是 " + age + ",身高是 " + height);
    }
}

class Teacher extends People
{
    String school;//所在學校
    String subject;//學科
    int seniority;//教齡

    //覆蓋People類中的say()方法
    void say()
    {
        System.out.println("我叫" + name + ",在" + school + "教" + subject + ",有" + seniority + "年教齡");
    }

    void lecturing()
    {
        System.out.println("我已經" + age + "歲了,依然站在講臺上講課");
    }
}

執行結果:

我叫小布,在清華大學教Java,有12年教齡
我已經70歲了,依然站在講臺上講課

為了加強理解,再看一個例子:

package day33;
/*
 * 父類 超類 基類
 * 子類 派生類
 * extends只能繼承一個類,java不支援多重繼承
 * 子類繼承父類之後,子類可以呼叫父類的屬性和方法
 * 也可以重寫父類的屬性和方法,還可以增加自己的屬性和方法
 */
//父類(動物類)
public class Animal
{
    private String type;//類別
    private String skin;//膚色
    private int legCount;//幾條腿

    public void eat()
    {
        System.out.println("動物在吃東西");
    }

    public void huxi()
    {
        System.out.println("動物在呼吸");
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getSkin() {
        return skin;
    }

    public void setSkin(String skin) {
        this.skin = skin;
    }

    public int getLegCount() {
        return legCount;
    }

    public void setLegCount(int legCount) {
        this.legCount = legCount;
    }
}
package day33;

public class Sheep extends Animal 
{
    public void eat()
    {
        System.out.println("山羊在吃草");
    }

    public void fire()
    {
        System.out.println("山羊在打架");
    }

}
package day33;
//子類 老虎類
public class Tiger extends Animal 
{
    public void eat()
    {
        System.out.println("老虎在吃東西");
    }

    public void run()
    {
        System.out.println("老虎在跑");
    }

}
package day33;

public class Test 
{
    public static void main(String[] args)
    {
        Tiger t = new Tiger();
        t.eat();
        t.setType("老虎");
        t.setSkin("金黃色");
        t.setLegCount(4);

        System.out.println(t.getType()+","+t.getSkin()+","+t.getLegCount());

        t.run();

        Sheep e = new Sheep();
        e.eat();
        e.fire();
    }

}

執行結果:

老虎在吃東西
老虎,金黃色,4
老虎在跑
山羊在吃草
山羊在打架

注意:構造方法不能被繼承,掌握這一點很重要。 一個類能得到構造方法,只有兩個辦法:編寫構造方法,或者根本沒有構造方法,類有一個預設的構造方法。