繼承可以看成是類與類之間的衍生關系。比如狗類是動物類,牧羊犬類又是狗類。于是我們可以說狗類繼承了動物類,而牧羊犬類就繼承了狗類。于是狗類就是動物類的子類(或派生類),動物類就是狗類的父類(或基類)。
在 java 中一個類只有一個父類,所以 Java 中的繼承是單繼承。就像我們每個人只有一個親生父親,而我們如果有一個有錢的父親我們就是富二代;有一個明星父親,我們就是星二代。繼承可以讓子類直接擁有父類的所有屬性和方法(屬性和方法的修飾符是 PRivate 就不行,因為是私有的嘛)。而繼承的好處便是可以實現代碼的復用,使我們程序猿的福利啊!
我們創建一個類需要它來繼承某一個類的語法:
class 子類 extends 父類例如我們定義了一個 Animal 類,我們在創建一個 Dog 類,我們需要它繼承 Animal 類
class Dog extends Animal { ...}我們先創建一個父類 Animal
package com.shiyanlou;public class Animal { public int legNum; //動物四肢的數量 //類方法 public void bark() { System.out.println("動物叫!"); }}接下來創建一個子類
1、點擊創建 class 類
2、輸入子類名稱,點擊Superclass
后面的Browse...
尋找父類,與之建立繼承關系

3、在Choose a type:
下的輸入框內輸入要尋找的父類,然后選擇,結束。

package com.shiyanlou;public class Dog extends Animal {}上面便是系統生成的代碼,Dog 類繼承了父類 Animal,我們 Dog 類里什么都沒有寫,其實它繼承了父類 Animal,所以 Dog 類擁有 Animal 類的全部方法和屬性(除開私有的方法和屬性)。我們創建一個測試類測試一下。

方法的重寫
雖然子類可以繼承父類的方法,但如果子類對父類的方法不滿意,子類想在里面加入適合自己的一些操作時,我們就需要將方法進行重寫。并且子類在調用方法中,優先調用子類的方法
比如上一個例子中 Animal 有bark()
這個方法代表了動物叫,但是不同的動物有不同的叫法,比如狗是汪汪汪,貓是喵喵喵。
當然在方法重寫時我們需要注意,重寫的方法一定要與原父類的方法語法保持一致,比如返回值類型,參數類型及個數,和方法名都必須一致。
例如:
package com.shiyanlou;public class Dog extends Animal { //重寫父類方法 public void bark() { System.out.println("汪!汪!汪!"); }}繼承的初始化順序
我們學習了繼承后,知道在一個繼承關系中一定會有一個父類和至少一個子類,那么在程序運行的過程中,是為父類進行初始化,還是先調用的子類進行初始化的呢? 繼承的初始化順序是先初始化父類再初始化子類。
我們根據代碼來驗證一下。
package com.shiyanlou;public class Animal { public int legNum = 4; // 動物四肢的數量 //Animal的構造方法 public Animal(){ System.out.println("動物有" + legNum + "腿"); System.out.println("父類的構造方法被調用!"); }}package com.shiyanlou;public class Dog extends Animal { //Dog類的構造方法 public Dog(){ System.out.println("子類的構造方法被調用!"); }}package com.shiyanlou;public class test { public static void main(String[] args) { // TODO Auto-generated method stub Dog a = new Dog(); //生成一個Dog類對象a }}最后輸出結果:

由此可知,系統先創建了父類對象,再創建了子類對象,先初始化了屬性,再調用了構造函數。
補充知識點:
final
關鍵字可以修飾類、方法、屬性和變量
final 修飾類,則該類不允許被繼承
final 修飾方法,則該方法不允許被覆蓋(重寫)
final 修飾屬性:則該類的屬性不會進行隱式的初始化(類的初始化屬性必須有值)或在構造方法中賦值(但只能選其一)
final 修飾變量,則該變量的值只能賦一次值,即變為常量
super
關鍵字在子類內部使用,代表父類對象。
訪問父類的屬性 super.屬性名
訪問父類的方法 super.bark()
|
新聞熱點
疑難解答