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

时间:2014-01-18 16:36:30

标签: java inheritance subclass abstract superclass

具有抽象类的整个概念究竟是什么(在我的例子中,我指的是java)。 我理解这一事实太过笼统,无法实现,因此无用。但肯定只是声明它是非抽象的并使用相同的继承,如果它是一个抽象类将使用相同的继承将给出所有相同的结果。

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

主要优点是您无法实例化抽象类。你可能有这样的课程Document

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
    }
}

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

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
    }
}

但是你不希望别人制作新的Document

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

你希望人们做这样的事情:

Document doc = new MyDocument();

解决方案是使Document抽象:

public abstract class Document

并使方法也抽象化:

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

然后您无法实例化Document,但您可以实例化子类。子类必须覆盖readwrite

答案 2 :(得分:0)

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

答案 3 :(得分:0)

将抽象类视为在API中创建契约的一种方式。

假设您正在创建一个程序,其中包含商店销售的商品列表。现在这个列表当然包含具有某些共同特征和某些个性特征的项目。但是我们不能出售“项目” - 我们想出售“电视”或“桌子”。

因此,您将创建一个抽象类“Item”,它具有价格标签,制造日期等。但是您永远不希望任何人创建类Item的实例,因为项目可以是任何东西。

您希望程序员子类化并创建自己的Item类型,这样就完成了Item所需的契约。反过来,API允许您添加子类item的类,以放在可用项的商店列表中。这也将自动为这些类提供在子类化时不需要考虑的功能,并且要求您覆盖必须为类实现的方法。

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

希望它有意义。另外,我可以随意发表评论,以便详细说明。