繼承java
java的繼承具備單繼承的特色,每一個子類只有一個直接父類。ide
繼承的特色ui
java的繼承經過extends關鍵字來實現,實現繼承的類被稱爲子類,被繼承的類被稱爲父類,有時也稱爲基類,超類。this
由於子類是一種特殊的父類,所以父類包含的範圍總比子類包含的範圍要大,因此能夠認爲父類是大類,而子類是小類。code
java裏子類繼承父類的語法格式以下:對象
修飾符 class Subclass extends superclass繼承
{ //類定義部分}it
extends關鍵字在英文中是擴展,不是繼承!編譯
public class Fruit { public double weight; public void info() { System.out.println("我是一個水果!重"+weight+"g!"); } }
定義Fruit類的子類Apple:class
public class Apple extends Fruit { public static void main (String[]args) { //建立Apple對象 Apple a=new Apple(); //Apple 對象自己沒有weight Field /由於Apple的父類有weight Field,也能夠訪問Apple對象的Field a.weight = 56; //調用Apple對象的info方法 a.info(); } }
java中只有一個直接父類,能夠有多個間接父類。
重寫父類方法
通常子類老是以父類爲基礎,額外增長新的Field和方法。可是:子類須要重寫父類的方法。
方法重寫要遵循」兩同兩小一大「原則,「兩同」即方法名相同,形參列表相同;「兩小」指的是子類方法返回值類型應該比父類方法返回值類型更小或相等,子類方法聲明拋出的異常類應比父類方法聲明拋出的異常類更小或相等;「一大」指的是子類方法的訪問權限應該比父類方法的訪問權限更大或相等。
若是須要在子類方法中調用父類中被覆蓋的方法,則能夠使用super(被覆蓋的是實例方法)或者父類類名(被覆蓋的是類方法)做爲調用者來調用父類中被覆蓋的方法。
super限定
經過super限定來調用父類被覆蓋的實例方法。
方法重載和方法重寫在英文中分別是overload和override,重載主要是發生在同一個類的多個同名方法之間,而重寫發生在子類和父類的同名方法之間。
若是子類定義了和父類同名的Field,則會發生子類Field隱藏父類Field的情形。在正常狀況下,子類裏定義的方法直接訪問該Field默認會訪問到子類中定義的Field,沒法訪問到父類中被隱藏的Filed。在子類定義的實例方法中能夠經過super來訪問父類中被隱藏的Field。若是在子類裏定義了與父類中已有變量同名的變量,那麼子類中定義的變量會隱藏父類中定義的變量。由於子類中定義與父類中同名的實例變量並不會徹底覆蓋父類中定義的實例變量,它只是簡單地隱藏了父類中的實例變量。因此會出現以下特殊的情形。
class Parent { public String tag = "瘋狂java講義"; } class Derived extends Parent { //定義一個私有的tag實例變量來隱藏父類的tag實例變量 private String tag = "輕量級javaee企業應用實戰"; } public class HideTest { public static void main(String[] args) { Derived d = new Derived(); //程序不可訪問d的私有變量tag,因此在下面語句將引發編譯錯誤 //System.out.println(d.tag); //將d變量顯式地向上轉型爲Parent後,便可訪問tag實例變量 //程序將輸出:「瘋狂java講義」 System.out.println(((Parent)d).tag); } }
(很晚了,要休息了,明天還要工做,就先寫這麼多,今天很開心,我夏找我呢)
調用父類的構造器
子類不會得到父類的構造器,但子類構造器裏能夠調用父類構造器的初始化代碼。
在一個構造器中調用另外一個重載的構造器使用this調用來完成,在子類構造器中調用父類構造器使用super調用來完成。使用super調用父類構造器必須出如今子類構造器執行體的第一行。
昨天的終於補完了,又到了晚上了,今天陪我夏玩耍了,在程序和女友之間,確定選女友啊,我還沒達到那種程序比交女友更高級的境界。