关于oop:Java中的抽象类

Abstract class in Java

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

Possible Duplicate:
Abstract class in Java

在Java中,

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

如果没有,在什么条件下?

一般来说,我们什么时候才能确定类是抽象类?


绝对不是。类可以在不抽象的情况下进行扩展。

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

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
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 };
}

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

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


Does every class that other classes extends from must be an abstract class?

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

例如:

1
public abstract class Foo{}

多读

  • 抽象类


您可以将抽象类看作某种产品的原型版本。例如,您有一个产品的规范,有几种方法可以实现它们。抽象类指定了所有这些规范,但是它没有给出任何实现,因为没有默认值,它们必须由产品的所有版本(子类)以不同的方式实现。然而,它可能已经实现了产品的所有类型的特性。

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


每一个超级类都不需要抽象,但是Scott Meyer在他的"有效C++"中认为对象层次结构中的每个非叶类都应该是抽象的。既然我们有Java,这个概念应该扩展到阅读"抽象或接口"。


每个类都不是抽象类。

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

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

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


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

我已经在很多地方看到过它,在这些地方它有一些默认的通用行为,只有少数子类需要更改。

另外,正如另一个答案中的statd所述,如果我们不希望用户实例化常规类,但希望强迫他使用特定的实现,那么abstract会有所帮助。