在java中,所有的類都有一個默認的父類Object,即使我們沒有顯式的去繼承這個類。在Object類中定義了一些方法,其中有幾個方法是我們必須掌握的,比如equals方法,hashCode方法,wait方法,notify方法,getClass方法等。這些方法我會在以后文章給大家介紹,今天我們要討論的是java中的繼承。
在繼承關系中一般兩個角色,父類和子類,其中父類也叫基類,子類也叫派生類。比如Dog類和Animal類,Dog類就是子類,Animal類就是父類,其中子類也就是Dog類繼承了父類也就是Animal類的非私有屬性和方法,同時子類可以增加子類特有的屬性和方法,並且子類可以重寫父類的方法。使用繼承首先可以減少大量的重復性代碼,把公共的代碼提取出來放到父類中同時也方便管理。
接下來我們用代碼來進一步解釋,首先定義一個父類Animal類:
public class Animal { private Integer age; public Animal(){ System.out.println("Animal construct method"); } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public void eat(){ System.out.println("eat food"); } }
然后我們在定義一個dog類:
public class Dog extends Animal{ private String color; //毛色 public Dog(String color){ this.color = color; } public void run(){ System.out.println("Dog is running"); } @Override public void eat(){ System.out.println("dog eat bone"); } }
在Dog類中我們添加了子類自己的方法和屬性並重寫了父類的一個方法。在程序中的調用:
public static void main(String[] args) { Dog dog = new Dog("紅色"); dog.eat(); } 控制台打印: Animal construct method dog eat bone
這里需要說的我們在new Dog類的時候父類的構造方法也會執行並且會先於子類執行。定義一個cat類:
public class Cat extends Animal{ @Override public void eat(){ super.eat(); System.out.println("cat eat finsh"); } }
調用Cat的eat方法發現不只打印了“cat eat finsh”還打印了父類的“eat food”。當父類方法和子類方法重名時,可以通過super關鍵字強制訪問父類的變量和方法並且在new子類對象的過程中,也可以通過super關鍵字調用父類的構造方法,沒有使用super的時候默認調用父類的默認的構造方法,父類的構造方法要先於子類執行。