Java中抽象类的目的是什么?

我对抽象类及其用法有一些疑问。 我知道他们的基本知识; 例如,他们无法实例化,他们可以采用具体和抽象的方法,……但我想我想知道的是, 他们在生活中服务的目的什么(在软件工程中)?

Java中抽象类的目的是什么? 为什么以及何时应该使用Abstract类? 如果你可以使用普通类然后inheritance它,为什么要inheritance一个抽象类? 如何使用抽象类让我们的生活更轻松? 它会提供更好的可维护性吗? 更灵活? …

顺便说一句,我已经看过一些类似的问题和答案,包括理解Java中抽象类的目的 ,但它们没有回答我的问题。 我更倾向于寻找能够揭示Java中引入抽象类背后的哲学的答案。

谢谢

abstract类可以用作其他类的模板类型,最常用于inheritance

最好的例子是从书头第一个java:

 abstract class Animal(){} 

然后你可以扩展儿童类,如: dogcatfish

抽象类是包含一个或多个抽象方法的类。 抽象方法是声明的方法,但不包含任何实现。 抽象类可能无法实例化,并且需要子类来提供抽象方法的实现。 让我们看一个抽象类和抽象方法的示例。

假设我们通过创建一个以名为Animal的基类开始的类层次来模拟动物的行为。 动物能够做不同的事情,如飞行,挖掘和行走,但也有一些常见的操作,如吃饭和睡觉。 一些常见的操作由所有动物执行,但也以不同的方式执行。 当以不同的方式执行操作时,它是抽象方法的一个很好的候选者(强制子类提供自定义实现)。 让我们来看一个非常原始的动物基类,它定义了一种用于发出声音的抽象方法(例如狗吠,牛吼或猪叮当)。

 public abstract Animal { public void eat(Food food) { // do something with food.... } public void sleep(int hours) { try { // 1000 milliseconds * 60 seconds * 60 minutes * hours Thread.sleep(1000 * 60 * 60 * hours); } catch (InterruptedException ie) { /* ignore */ } } public abstract void makeNoise(); } 

请注意,abstract关键字用于表示抽象方法和抽象类。 现在,任何想要实例化的动物(如狗或牛)都必须实现makeNoise方法 – 否则无法创建该类的实例。 让我们看一下扩展Animal类的Dog and Cow子类。

  public Dog extends Animal { public void makeNoise() { System.out.println("Bark! Bark!"); } } public Cow extends Animal { public void makeNoise() { System.out.println("Moo! Moo!"); } } 

现在您可能想知道为什么不将抽象类声明为接口,并让Dog和Cow实现接口。 当然可以 – 但你还需要实施吃饭和睡眠方法。 通过使用抽象类,您可以inheritance其他(非抽象)方法的实现。 你不能用接口做到这一点 – 接口不能提供任何方法实现。