繼承是一種由已有的類創建新類的機制。利用繼承,可以先創建一個擁有共同屬性的一般類,根據該一般類再創建具有特殊屬性的新類。由繼承而得到的類稱爲子類(Subclass),被繼承的類被稱爲父類(Superclass)。
直接或間接被繼承的類都是父類。子類繼承父類的狀態和行爲,同時也可以修改父類的狀態和行爲,並添加新的狀態和行爲。Java中不支持多重繼承。
創建子類
java中通過在類的聲明中加入extends子句來創建一個類的子類,其格式如下:
-
class Subclass extends Superclass{
…
}
如果默認extends子句,則該類爲java.lang.Object的子類。子類可以繼承父類中訪問權限設定爲public、protected的fields和methods。但是不能繼承訪問權限爲private的內容。還有一種default訪問權限,在繼承的過程中如果遇到default權限的fields和method時需要分以下兩種情況考慮:
•►子類和父類在同一包中,子類可以繼承父類的default fields 和default methods。
•►子類和父類不在同一包中,子類不能繼承父類的default fields 和default methods。
Fields的隱藏和Methods的重寫
當子類中定義的fields和父類中的fields同名時,稱子類的fields隱藏了父類的fields。當子類中定義了一個method,並且這個method的名字、返回類型、參數個數以及類型都和父類的某個方法完全相同時,父類的這個方法將被隱藏,這稱作重寫了父類的method。
子類通過fields的隱藏和methods的重寫可以把父類的狀態和行爲改變爲自身的狀態和行爲。
super關鍵字
子類在隱藏了父類的fields或重寫了父類的methods後,常常還要用到父類的fields或在重寫的methods中使用父類被重寫的methods以簡化代碼的編寫,這時就要訪問父類的fields和methods,Java中通過super來實現父類成員的訪問。我們知道,this用來引用當前對象,與this相似,super用來引用當前對象的父類。
super的使用可以分爲下面3種情況:
•►用來訪問父類被隱藏的fields,如:super.variable
•►用來調用父類中被重寫的methods,如:super.method([paralist])
•►用來調用父類的constructor,如:super([paralist])
對象的上轉型對象
假設class A是class B的父類,當用子類創建一個object,並把這個object的引用放到父類的對象中時,eg:
-
A a;
A a = new B();
或
A a;
B b = new B();
a = b;
則稱這個父類對象a是子類對象b的上轉型對象。
對象的上轉型對象的實體是由子類負責創建的,但上轉型對象會失去原對象的一些屬性和功能。上轉型對象具有如下特點:
•►上轉型對象不能操作子類新增的fields和methods。
•►上轉型對象可以操作子類繼承或重寫的fields和methods。
•►如果子類重寫了父類的某個method後,當對象的上轉型對象調用這個方法時一定是調用了這個重寫的方法,因爲程序在運行時知道,這個上轉型對象的實體是子類創建的,只不過損失了一些功能而已。
Demo: public class Parent { public int i = 10; }
public class Subclass1 extends Parent { public int i = 20; }
public class Subclass2 extends Parent { public int i = 30; }
public class Main {
/** * @param args */ public static void main(String[] args) { Parent p = new Parent(); Parent sub = new Subclass1(); Subclass2 sub2 = new Subclass2();
System.out.println(p.i + sub.i + sub2.i); }
}
|