为什么抽象方法是抽象的?

Why are abstract methods abstract?

抽象的东西意味着隐藏数据。我不明白抽象方法如何向用户隐藏任何数据。可以提出一个论点,即抽象方法不需要实现,而是在 class 层次结构的宏伟计划中,不会向用户隐藏任何内容。抽象方法似乎只是强制实现所以我不明白为什么它们是抽象的。

For something to be abstract means to hide data.

我认为你的困惑来自这个(错误的)前提。

抽象最好理解为没有实现。它与 concrete 相反(即有实现)。

请参阅来自维基百科的 abstract type 文章:

In programming languages, an abstract type is a type in a nominative type system that cannot be instantiated directly; a type that is not abstract – which can be instantiated – is called a concrete type.

我认为当你使用抽象的实际定义时,Java 抽象方法的命名更有意义:

existing in thought or as an idea but not having a physical or concrete existence

这是有道理的,因为 Java 抽象方法是没有实现的方法定义。

虽然抽象classes和方法可以用于数据隐藏,但是“抽象”并不意味着“隐藏数据”。 Java language specification 定义抽象 classes 和方法如下:

An abstract class is a class that is incomplete, or to be considered incomplete.

An abstract method declaration introduces the method as a member, [...], but does not provide an implementation (§8.4.7). A method that is not abstract may be referred to as a concrete method.

Abstract classes 可用于数据隐藏。例如,java.awt.Toolkit 是一个抽象的 class,但它的具体实现是私有的。要使用 Toolkit,您需要使用静态工厂方法 getDefaultToolkit 获取实例,其中 returns 是具体 class 的实例,但您不知道是哪一个。通过提供 public 抽象工具包 class,您可以使用 class 提供的服务,但“数据”(具体实现)对您是隐藏的。

术语抽象 表示某些东西不是有形的,而是更多的概念。而实现是可以使用的实际事物。用具体这个词来形容后者。

摘要 classes 是 classes 具有零个或多个实现的 mixture 和零或更多未实现的方法,用于构建具有更多或专门功能的其他 classes。所以任何 class 子 class 是一个摘要 class 可能有:

  1. 从抽象 class 继承的一组核心实现方法,不一定会因实现而异。
  2. 抽象class指定的一组方法签名(未实现的方法)必须在子classes中实现,并且其实现可能因子实现而异class 要求。
  3. 子class 的作者认为在摘要class 中未指定的任何其他附加方法是必需的。

以上1、2组成摘要class.

在上述 (1) 的情况下,如果 subclass 的作者认为有必要,可以覆盖这些方法(除非这些方法被声明为 final).

最后,Abstract classes 可以继承class 其他采用上述相同理念的Abstract classes。