java – 抽象类和具体类之间的独特区别

我知道抽象类和具体类之间的差异很小。 我知道你不能用具体类创建一个抽象类的实例,抽象类可以有’抽象’方法。

但我有一个像下面这样的例子。 很多时候,我们看到以下示例正在起作用。 我将跳过一些可以在Parent类中定义的常用方法。

public abstract class Parent { public void init() { doInit(); } public abstract void doInit(); } public class Child extends Parent { public void doInit() { // implementation } } 

我认为我们可以用如下的具体类做同样的事情。

 public class Parent { public void init() { doInit(); } public void doInit() { // Empty } } 

我很想知道是否有任何独特的情况我们必须使用抽象类。 运行期间是否与上述示例有任何显着差异?

谢谢。

在这种情况下使用abstract类的原因是强制每个inheritance基类的人都覆盖抽象的doInit方法。 如果没有类和方法是抽象的,他们可能会忘记这样做,并且编译器不会捕获它们。

除了这种实用的目的,抽象类提供了一种强大的方式来将您的设计理念传达给代码的读者。 抽象类告诉读者,内部方法为一组相关类提供了一些通用实现,而不是实现您正在建模的单个概念。 经常向读者传达您的意图与编写正确的代码一样重要,否则他们可能会在维护代码时破坏某些内容。

在Java中习惯于调用抽象类Abstract... ; 在您的示例中,这将是AbstractParent

当然,你可以这样做,但这一切都取决于正确的业务逻辑。在某种情况下,你可能希望对扩展你的代码的人强制执行一项政策。

例如,我编写了一个Employee类,并扩展了我的类以编写ProjectManager类。 但是假设业务不允许直接实例化Employee(就像我说的那样,只是一个例子)。 所以我将我的Employee类声明为抽象,从而对我的类的所有扩展程序(读取:你)强制执行它们无法直接实例化Employee的规则。 (当然,它将通过inheritance链间接发生,即在子对象之前创建父对象。)

如果使用得当,A处的人员将控制B处其他人的编码方式。

具体类是具有所有方法的实现(代码内部)的类。 它是否来自其他一些类并不重要。

 public abstract class IAmAbstract{ public void writeMe(){ System.out.println("I am done with writing"); } } public class IAmConcrete extends IAmAbstract{ public void writeMe(){ System.out.println("I am still writing"); } } 

抽象类具有与软件设计一起使用的各种有用属性。

除了明显的差异,例如无法实例化和能够持有抽象方法。 它们对于定义通用但可覆盖的函数非常有用,它们保存静态方法,以逻辑方式处理它的子节点。

我最喜欢的是抽象工厂模式。

通过使工厂成为它可能创建的所有类的父级,它可以强制创建所需的function,这实际上会导致奇怪的假象,其中技术上更紧密耦合的代码实际上更容易维护。