在計劃繼承時一個比較好的規則是:將所有類的成員欄位都設為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"); } }