Java繼承

FrankYou發表於2016-11-01

在計劃繼承時一個比較好的規則是:將所有類的成員欄位都設為private,並將所有的方法都設定為public(protected成員也與允許衍生出來的類訪問它)

Java提供了一個super關鍵字用來引用父類中的相關方法。

進行繼承時,我們並不限於只能使用基礎類的方法。亦可在衍生出來的類里加入自己的新方法。

建立衍生類(繼承類)的一個物件時,它在其中包含了一個基礎類(父類)的一個“子物件”。

基礎類子物件應該正確地初始化,而且只有一種方法能保證這一點:在建構函式中執行初始化,通過呼叫基礎類的建構函式,後者有足夠的能力和許可權來執行對基礎類的初始化。在衍生類(繼承類)的構建器中,Java 會自動插入對基礎類構建器的呼叫。

/**
 * Created by xfyou on 2016/11/1.
 */
class Cleanser {
    private String s = new String("Cleanser");

    public void append(String a) {
        s += a;
    }

    public void dilute() {
        append(" dilute()");
    }

    public void apply() {
        append(" apply()");
    }

    public void scrub() {
        append(" scrub()");
    }

    public void print() {
        System.out.println(s);
    }

    public static void main(String[] args) {
        Cleanser x = new Cleanser();
        x.dilute();
        x.apply();
        x.scrub();
        x.print();
    }
}

public class Detergent extends Cleanser {
    // Change a method
    public void scrub() {
        append("Detergent.scrub()");
    }

    // Add methods to the interface:
    public void foam(){
        append("foam()");
    }

    // Test the new class
    public static void main(String[] args) {
        Detergent x = new Detergent();
        x.dilute();
        x.apply();
        x.scrub();
        x.foam();
        x.print();
        System.out.println("Testing base class:");
        Cleanser.main(args);
    }
}

  當基礎類中用含有自定義了一個含有自變數的建構函式時(覆蓋了預設的建構函式),繼承類的建構函式中必須明確地顯示的對父類建構函式的呼叫

public class Chess extends BoardGame {
    public Chess() {
        super(11);
        System.out.println("Chess constuctor");
    }

    public static void main(String[] args) {
        Chess x = new Chess();
    }
}

class Game{
    public Game(int i) {
        System.out.println("Game constructor");
    }
}

class BoardGame extends Game{
    public BoardGame(int i) {
        super(i);
        System.out.println("BoardGame constructor");
    }
}

 繼承與合成結合起來使用:

public class PlaceSetting extends Custom {
    Spoon sp;
    Fork frk;
    Knife kn;
    DinnerPlate pl;

    public PlaceSetting(int i) {
        super(i + 1);
        sp = new Spoon(i + 2);
        frk = new Fork(i + 3);
        kn = new Knife(i + 4);
        pl = new DinnerPlate(i + 5);
        System.out.println("PlaceSetting constructor");
    }

    public static void main(String[] args) {
        PlaceSetting x = new PlaceSetting(9);
    }
}

class Plate {
    public Plate(int i) {
        System.out.println("Plate constructor");
    }
}

class DinnerPlate extends Plate {
    public DinnerPlate(int i) {
        super(i);
        System.out.println("DinnerPlate constructor");
    }
}

class Utensil {
    public Utensil(int i) {
        System.out.println("Utensil constructor");
    }
}

class Spoon extends Utensil {
    public Spoon(int i) {
        super(i);
        System.out.println("Spoon constructor");
    }
}

class Fork extends Utensil {
    public Fork(int i) {
        super(i);
        System.out.println("Fork constructor");
    }
}

class Knife extends Utensil {
    public Knife(int i) {
        super(i);
        System.out.println("Knife constructor");
    }
}

class Custom {
    public Custom(int i) {
        System.out.println("Custom constructor");
    }
}

 

相關文章