说我有一个动物类,我想为每种动物不同的类和功能。这样做有两种方式:通过继承为什么扩展抽象类来改变函数定义,当我可以简单地使用方法覆盖?
方法覆盖:
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