【问题标题】:Abstract class in Java [duplicate]Java中的抽象类[重复]
【发布时间】:2011-08-24 20:43:25
【问题描述】:

可能重复:
Abstract class in Java

在 Java 中,

其他类扩展的每个类都必须是抽象类吗?

如果不是,在什么条件下?

更笼统地说,我们什么时候决定一个类是抽象类?

【问题讨论】:

  • 我不这么认为,达莫达尔。这是关于抽象的需要,而不是概念的含义。
  • 我同意 Urs Reupke 的观点。
  • 请再次检查问题“更一般地说,我们什么时候决定一个类是抽象类?”
  • 通过观察 java.lang.Object 不是抽象的,很容易回答第一个问题...

标签: java oop abstract-class


【解决方案1】:

绝对不是。类可以扩展而不是抽象的。

通常当您需要基于其他方法定义某些方法的行为时,您将类抽象化,但您无法在此类中提供这些方法的实现。

例如:

public abstract class Vehicle {
   public void goHome() {
       move(getHome());
   }
   public abstract void move();
}

class Car extends Vehicle {
   @Override public void move() { //use engine };
}
class Bicycle extends Vehicle {
   @Override public void move() { //use pedals };
}

(如果类本身不是抽象的,则该类不能有抽象方法)。

另一个有效的原因是该类是某个基类,实例化没有意义。您可以指定受保护的构造函数,也可以将其设为抽象。

【讨论】:

  • 很好的答案,非常有用。谢谢。
【解决方案2】:

其他类扩展的每个类都必须是抽象类吗?

如果一个类在其声明中包含abstract,则其被视为abstract

例如

public abstract class Foo{}

了解更多

【讨论】:

  • 感谢您的评论。没有抽象声明的类是否可以包含抽象内部方法?
  • No 在这种情况下需要将类声明为抽象
【解决方案3】:

每个类的超类都不是抽象类。

例如Object类是所有类的超类,但它不是抽象的。

我们将在不希望程序员或用户创建对象的地方使用抽象类。

还要绑定默认属性和行为,以便扩展抽象的类必须强制继承该属性。

【讨论】:

    【解决方案4】:

    每个超类都不需要是抽象的,但 Scott Meyer 在他的“Effective C++”中认为对象层次结构中的每个非叶类都应该是抽象的。现在我们有了 Java,这个概念可能应该扩展为“抽象或接口”。

    【讨论】:

      【解决方案5】:

      您可以将抽象类视为某种产品的原型版本。例如,您有一个产品规范,并且可以通过多种方式实现它们。抽象类指定了所有这些规范,但是它没有提供任何实现,因为没有默认值,它们必须由产品的各种版本(您的子类)以不同的方式实现。然而,它可能已经实现了各种产品将具有的功能。

      这自动意味着您无法初始化抽象类,因为它没有实现规范的某些部分。

      【讨论】:

        【解决方案6】:

        为了回答您的一般问题,我们可能希望类是抽象的,以便在其中具有一些一般行为,而子类具有特定的实现。

        我主要在很多地方看到它,其中有一些默认的通用行为很好,只有少数子类需要更改。

        另外,正如另一个答案中的 statd,如果我们不希望用户实例化通用类但想强制他使用特定的实现,抽象会有所帮助。

        【讨论】:

          猜你喜欢
          • 2023-03-16
          • 1970-01-01
          • 2018-07-11
          • 2011-07-13
          • 2011-12-05
          • 2011-07-02
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          相关资源
          最近更新 更多