標籤:
繼承是複用程式碼的有力手段,當多個類(Sub1,Sub2,...Sub100)之間存在相同的屬性和方法時,可從這些類中抽象出父類Base。在父類Base中定義這些相同的屬性和方法,所有的Sub類無須重新定義這些屬性和方法,而只需要通過extends語句來聲明繼承Base類:
public class Sub extends Base {...}
Sub 類就會自動擁有在Base類中定義的屬性和方法。
6.1 繼承的基本文法
在JAVA語言中,用extends 關鍵字來表示一個類繼承了另一個類,例如:
public class sub extends Base{ ... }
以上代碼錶明Sub類繼承了Base類。那麼類到底繼承了Base類的哪些東西呢?這需要分為以下兩種情況。
- 當 Sub類和Base類位於同一個包中:Sub類繼承Base類中public、protected和預設存取層級的成員變數和成員方法。
- 當 Sub類和Base類位於不同的包中:Sub類繼承Base類中public和protected存取層級的成員變數和成員方法。
假定Sub和Base類位於同一個包中,以下程式示範在Sub類中可繼承Base類的哪些成員變數和方法。
public class Base { public int publicVarOfBase=1; //public 存取層級 private int privateVarOfBase=1; //public 存取層級 int defaultVarOfBase=1; //預設存取層級 protected void methodOfBase() {} //protected 存取層級 } public class Sub extends Base{ public void methodOfBase(){ publicVarOfBase=2; //合法,可以訪問Base類的public類型的變數 defaultVarOfBase=2; //合法,可以Base類的預設存取層級的變數 privateVarOfBase=2; //非法,不能訪問Base類的private類型的變數 methodOfBase(); //合法,可以訪問Base類的protected類型的方法 } public static void mian (String args[]){ Sub sub=new Sub(); Sub.publicVarOfBase=3; //合法,Sub類繼承了Base類的public類型的變數 Sub.privateVarOfBase=3; //非法,Sub類不能繼承Base類的private類型的變數 Sub.defaultVarOfBase=3; //合法,Sub類繼承了Base類的預設存取層級的變數 Sub.methodOfBase(); //合法,Sub類繼承了Base類的protected類型的方法 Sub.methodOfSub(); //合法,這是Sub類本身的執行個體方法 } }
Java語言不支援多繼承,即一個類只能直接繼承一個類。例如以下代碼會導致編譯錯誤。
class Sub extends Base1,Base2,Base3(...)
儘管一個類只能一個直接父類,但是它可以有多個間接的父類,例如以下代碼錶明Base1 類繼承Base2類,Sub類繼承Base1類,Base2類是Sub類的間接父類。
class Base1 extends Base2{...} class Sub extends Base1{...}
所以的Java 類都直接或間接地繼承了java.lang.Object 類。
6.2 方法重載(Overload)
對於類的方法(包括從父類中繼承的方法),如果有兩個方法的方法名相同,但參數不一致,那麼可以說,一個方法是另一個的重載方法。
重載方法必須滿足以下條件:
- 方法名相同。
- 方法的參數類型、人數、順序至少有一項不相同。
- 方法的傳回型別可以不相同。
- 方法的修飾符可以不相同。
在一個類中不允許定義兩個方法名相同,並且參數簽名也完全相同的方法。因為假如存在這樣的兩個方法,Java虛擬機器在運行時就無法決定到底執行哪個方法。參數簽名是指參數的類型、個數和順序。
java基礎學習筆記-繼承