說我有一個動物類,我想爲每種動物不同的類和功能。這樣做有兩種方式:通過繼承爲什麼擴展抽象類來改變函數定義,當我可以簡單地使用方法覆蓋?
方法覆蓋:
public class Animal { public void sound() {} } public class Dog extends Animal { public void sound() { System.out.println("bark"); } } public static void main(String[] args) { Animal dog = new Dog(); dog.sound(); }
通過擴展
Animal
抽象類:abstract public class Animal { abstract public void sound(); } public class Dog extends Animal { public void sound() { System.out.println("bark"); } } public static void main(String[] args) { Dog dog = new Dog(); dog.sound(); }
那麼,爲什麼我們使用抽象類什麼時候,第一種方法完成同樣的事情?我明白爲什麼我們使用接口 - 它建立了一個合同,任何實現它的類都必須具有某些方法和屬性。但是,如果通過簡單繼承可以實現同樣的事情,那麼抽象類的用法是什麼?
同樣的事情?所以如果你不在'Dog'中創建一個'sound()',那麼這兩個版本會發生什麼?顯然不一樣。這就告訴你爲什麼'abstract'在大多數情況下更好。 – Tom
使用'抽象'類你有2種類型的函數:有和沒有'抽象'關鍵字。用'abstract'關鍵字強制所有的子類必須實現這個方法。如果沒有'abstract'關鍵字,你可以在父母,子女上自行實現這個方法,如果需要的話你可以覆蓋每個孩子,或者可以使用父母的實現。如果使用'Interface',那麼你不能實現一個方法,每個孩子都必須自己實現它。 –
在第一種情況下,您必須在'Animal'中實現該方法,但在第二種情況下您不需要。另外,抽象類不是在內存中創建的,請參見:https://stackoverflow.com/questions/20756679/how-jvm-handles-abstract-class-in-java – tima