【发布时间】:2026-01-29 19:55:01
【问题描述】:
假设我有一个 Animal 类,我希望每种动物都有不同的类和功能。有两种方法可以做到这一点:
-
通过继承覆盖方法:
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在大多数情况下更好。 -
使用
abstract类,你有两种类型的函数:有和没有abstract关键字。使用abstract关键字强制所有子类必须实现此方法。如果没有abstract关键字,您可以在父级自行实现此方法,如果需要,您可以在每个子级上覆盖或使用父级的实现。如果使用Interface那么你不能实现一个方法,每个孩子必须自己实现它。 -
在第一种情况下你必须实现
Animal中的方法,但在第二种情况下你不需要。此外,抽象类不是在内存中创建的,请参见此处:*.com/questions/20756679/… -
如果
Animal是一个不完整的类,那么您不希望客户端能够创建它的实例。您通过使其抽象来表示这一点。在案例 1 中,客户可以执行Animal a = new Animal();。在情况 2 中,这将被编译器捕获。 -
必须实现抽象函数。父方法没有。这就是区别。此外,抽象类不能被实例化。你可以用私有构造函数创建一个类,但是当你有抽象类时为什么要这样做
标签: java oop inheritance abstract-class abstract