22

我知道在抽象类中方法都是抽象的,或者不是。但是为什么我不能在“普通”的非抽象类中创建抽象方法呢?

提前感谢您的任何解释!

4

9 回答 9

33

抽象方法基本上说,该方法没有实现,需要在子类中实现。但是,如果您在非抽象类中有一个抽象方法,则可以实例化该类并获取一个对象,该对象将具有一个未实现的方法,您将无法调用该方法。

于 2014-03-04T01:49:00.383 回答
3

拥有抽象方法可以防止类被实例化,从而使其成为事实上的抽象类。Java 坚持要求你明确声明这个事实以保持一致性:从技术上讲,Java 编译器不需要这个额外的标记来根据抽象方法的存在来决定一个类是否是抽象的,但是因为你可能想要使一个类抽象而不使它的任何方法都是抽象的,需要在类上声明是要走的路。

于 2014-03-04T01:51:24.810 回答
3

让我们首先了解为什么我们需要抽象方法之类的东西。答案很简单。我不希望我的扩展程序按原样使用我的方法,我希望他们定义自己的特定方法的行为。因为我在我的抽象类的其他方法中使用了这个方法。我可以在抽象类上提供 / ** java doc ** / 并指向它们使用默认行为。

class abstract LoveTheWorld {
    private int myKindness ;
    public int defaultGiveKindness() {
        myKindness -= 5 ;
        return 5 ;
    }
    /**
    you can use the defaultGiveKindness method, and not define your own behavior
    **/
    public abstract int giveKindness() ;
}

这也告诉扩展器他们只能扩展一个类(根据 java 继承规则)。现在,如果你想扭转这个故事,你可以使用接口而不是抽象类。但这一切都取决于您希望未来的开发人员遵守哪些限制,严格或灵活严格将保持紧密并确保减少错误,灵活将保持松散和自由并促进创新。问题是**你需要什么*8。

于 2014-03-04T02:01:37.993 回答
1

确实想调用提供实现的方法,这就是编程的本质

基于这个想法,Java规则是:

  • 不能实例化抽象类。
  • 只能实例化一个非抽象类。

如果 Java 允许您在一个非抽象类的实例上调用一个方法,但......没有实现,因为方法将是abstract=>根本没有意义

这就是为什么 Java 和任何其他处理类似机制的语言(如 C#(虚拟方法))阻止在非抽象类中声明抽象方法的原因。

于 2014-03-04T01:59:39.200 回答
1

如果一个具体的类可以有一个抽象方法,你就不能从它创建一个对象。想象一个Shape具有具体方法getColor()和抽象方法的方法draw()以抽象的方式引用一些东西是很棒的,所以有人可以告诉你“渲染一个形状!”:

public void render(Shape s) { ... }

但是当您使用该引用来调用时draw(),您希望引用的对象s知道如何做到这一点:

s.draw();

如果允许具体类有抽象方法,你可以实例化一个 Shape 对象,但是当你调用 draw 方法时,它不知道要画什么!即使它知道如何说出它的颜色、位置或其他 1000 件事情。如果不是 100% 指定,它就不能作为工作对象存在。

因此 Java 要求将此类类标记为抽象类。然后您将无法使用它们来创建对象,因为它们不知道如何具体地完成您期望从对象中完成的 100% 的事情。您只能使用抽象类来引用它们。您现在可以确定只有实现了所有方法的类才能用于创建对象,并且它们的名称也可能看起来不那么抽象:

Shape shape = new Rectangle();
render(shape);

现在你可以说“渲染形状”,你的程序,使用矩形的引用,就会知道如何draw()去做。

于 2014-03-04T02:40:10.890 回答
0

因为有一个抽象方法使它成为一个抽象类。推理是循环的。

于 2014-03-04T01:51:50.767 回答
0

抽象方法是为了将实现留给子类。如果普通类包含抽象方法,那么可以为该类创建对象,并且可以像普通方法一样调用抽象方法。那么就会出现问题。那就是原因抽象方法应该在抽象类中(这样就不能为抽象类创建对象)或只在接口中。

于 2014-03-04T02:07:37.173 回答
0

简单的答案是,如果该类不是抽象类(具体类),您可以实例化该类并调用该类的任何方法。但是假设您在该非抽象类中声明了一个抽象方法 - 这是不可能的调用那个特定的抽象方法。(为防止这种情况,我们不能在非抽象类中声明抽象方法)

于 2018-01-27T08:22:54.147 回答
0

换个角度看,如果您将一个方法定义为抽象,这意味着您肯定会将该类继承给其他一些类/类,否则就没有必要将其定义为抽象。此外,您应该在那些作为父类并且具有可继承的成员和其他子类的特征的类中保留抽象方法。因此,如果对于一个抽象方法需要继承整个类,那么我们也可以使用所需的访问说明符定义其他变量,以便它也可以根据需要被继承,因此无需创建父类的对象来调用具体成员。

于 2020-10-19T17:13:19.657 回答