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

时间:2012-07-27 03:00:43

标签: 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
    }
}

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

谢谢。

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:2)

当然,您可以这样做,但这一切都取决于正确的业务逻辑。在某种情况下,您可能希望对扩展代码的人员实施策略。

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

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

答案 2 :(得分:2)

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

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");
    }
} 

答案 3 :(得分:0)

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

除了明显的差异之外,例如无法实例化并且能够持有抽象方法。它们对于定义常见但可覆盖的函数很有用,它们保存静态方法,以逻辑方式处理它的子项。

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

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