繼承


1 繼承

class [ClassName] extends [SuperClass]
public class Animal {
    ....
}

class Dog extends Animal{
    ....    
}

以實際狀況來舉例,如果我們已經有了一個名為Animal的class

public class Animal {
    private String name;
    private String age; 
    private String color;
    public void changeName(String NewName){
        name=NewName;
    }
    public void showInfo(){
        System.out.println("name="+name);
        System.out.println("age="+age);
        System.out.println("color="+color);
    }
    public void bark(){
        System.out.println("bark");
    }
}

我們還要從animal這個類別中,細分出一個名為dog的類別及一個名為cat的類別

dog和cat除了有本來animal就會做的bark動作及特徵外,也會新增他們專屬的特徵跟動作

class Dog extends Animal{
    public void GetNewsPaper(){
        ...
    }
    public void CatchFrisbee(){
        ...
    }
}
class Cat extends Animal{
    public void LickingFur(){
        ...
    } 
}

class Dog不光只有GetNewsPaper( )和CatchFrisbee( )兩個function,它還可以使用父類別繼承下來的public及protected function(***為何沒有private請參照修飾字單元),請看下方例子

繼承會將父類別除了private外的所有function和variavble都繼承下來!!!

public class MainClass {

    public static void main(String[] args) {
        Dog myDog=new Dog();
        myDog.GetNewsPaper(); //使用自己的function
        myDog.bark(); //使用父類別Animal的function        
    }

}
------------------------
bark

可以將public function改成private,或將private variable改成protected或public,來試試看子類別能不能存取到

建構子繼承

public class Animal {
    private String name;
    private String age; 
    private String color;
    public Animal(){}
    public Animal(String n,String a,String c){
        name=n;
        age=a;
        color=c;
    }
    ....//以下省略程式碼
}

即使我們只要用Animal(String n,String a,String c)的建構子,建議還是要將Animal()預設建構子寫出來,子類別才不會被強制要求須使用建構子

class Dog extends Animal{
    Dog(String n,String a,String c){
        super(n,a,c);
    }
    ....
}

或許有人會疑惑,為什麼此處建構子我們沒加public,但是animal的建構子我們卻寫了

這是因為,Animal這個class本身就是public,如果所有人都可以存取這個class,卻不是所有人都可以使用它的建構子,這不是很怪嗎? 所以我們也將Animal的建構子設成public

而Dog本身是沒有設定的,按照modifier的教學內容,沒有設定的話只有跟他同個package的才可以存取它,所以它的建構子權限我也將它設成沒有設定的預設狀態。

public class MainClass {

    public static void main(String[] args) {
        Dog myDog=new Dog("Happy","13","yellow");
        System.out.println("");
        myDog.showInfo();

    }
}
---------------------------------
Animal constructor is called
Dog constructor is called

name=Happy
age=13
color=yellow

我在Animal跟Dog的建構子都各加上一行print,由此可以看出他們執行的順序

注意!!! 父類別的建構子完成之後,才會完成子類別的建構子。

單一繼承

在java裡面只允許單一繼承

例如研究生只能繼承自學生,但學生這個類別也已經繼承自人類,所以研究生同時是人類及學生的一種,但在java中你不能一次讓研究生繼承兩個類別,只能這樣間接繼承人類的屬性。

results matching ""

    No results matching ""