关于java:抽象方法和类:背后的概念?

abstract methods and classes: Concept behind?

本问题已经有最佳答案,请猛点这里访问。

抽象类背后的整个概念究竟是什么?(在我的例子中,我指的是Java)。我理解这样一个事实,即它太笼统了,不能自己实现,因此没有用处。但是可以肯定的是,仅仅声明它是非抽象的,并且使用相同的继承(如果它是一个抽象类的话,会使用相同的继承)就可以得到相同的结果。

在没有方法体的抽象超类中声明抽象方法,然后在其子类中重写它们,这样做的主要优点是节省时间吗?


主要的优点是不能实例化抽象类。您可能有这样的类Document

1
2
3
4
5
6
7
8
public class Document {
    public void write(File file) {
        // I have no idea how to implement this
    }
    public void read(File file) {
        // I don't know here either
    }
}

您希望人们为其文档类型创建子类:

1
2
3
4
5
6
7
8
public class MyDocument extends Document {
    public void write(File file) {
        // Now I know how to implement
    }
    public void read(File file) {
        // this also can be implemented
    }
}

但你不希望人们制造新的Documents:

1
Document doc = new Document(); // this should not be allowed

你想让人们做这样的事情:

1
Document doc = new MyDocument();

解决方案是将EDOCX1[0]抽象为:

1
public abstract class Document

并使方法抽象化:

1
2
public abstract void write(File file);
public abstract void read(File file);

然后你不能实例化Document,但是你可以实例化子类。子类必须覆盖readwrite


假设您的基类有一个必须在任何有用的子类中重写的方法。如果在基类中实现该方法,并且该方法未被重写,则在运行虚拟方法体之前,将找不到该错误。如果将方法和类抽象,则在编译时会发现错误。


把抽象类看作是在API中创建契约的一种方法。

假设您正在创建一个程序,该程序包含商店销售的商品列表。现在这个列表当然会包含一些项目,它们将具有某些共同的特性和特定的个人特性。然而,我们不能出售"物品"——我们想出售"电视"或"桌子"。

因此,您将创建一个抽象类"item",它具有价格标签、生产日期等,但是您不希望任何人创建类item的实例,因为一个项可以是任何东西。

您希望程序员对item类型进行子类化和创建自己的类,以完全满足item所需的契约。反过来,API允许您添加子类item的类,将其放到可用项的存储列表中。这还将自动为这些类提供在子类化时不需要考虑的功能,并要求您重写必须为类实现的方法。

在Java中,方法不需要抽象,在抽象类中,并且可以像普通类一样实现。例如,如果您有一个orice标签,您可以为这个价格标签实现一个getter——不需要强制子类实现这个。

希望这是有道理的。另外,请随时发表评论,以便我详细阐述。


当你不想创建一个类的对象时,你可以将它抽象化,并且子类的公共方法可以在抽象的超类中实现,另一个目的是把方法抽象化,这样子类就必须实现超类的抽象方法来编写自己的实现。就这么简单。