14

抽象类不需要包含任何抽象方法。

除了不能实例化抽象类的事实之外,还有其他理由使类抽象吗?

4

7 回答 7

12

抽象类意味着类的定义不完整,因此无法实例化。尽管它没有抽象方法,但它表明该类可用于继承。即使它对其中的所有方法都有实现,但实现可能仍然不完整,必须被扩展类覆盖。

于 2013-08-03T06:16:04.117 回答
6

抽象类的主要作用是提供一个合适的根类,可以从中派生出具体的(即非抽象的)子类。这是一个强大且通用的功能,可促进代码重用。抽象类封装了一系列数据类型共有的一般特性——这些特性在抽象类中太笼统而没有意义,但可以在子类中被覆盖

任何具有抽象方法的类都会自动抽象自己,并且必须使用关键字抽象来定义自己——有趣的是,抽象类不需要包含任何抽象方法

抽象类不能被实例化——换句话说,你不能创建抽象类的实例(对象)

即使不能实例化抽象类的对象,也可以声明对抽象类对象的引用,例如 Account a ;不会产生语法错误

如果抽象类的子类覆盖,即在其超类中提供每个抽象方法的实现,则子类称为具体类,并且可以创建子类的对象

如果抽象类的子类没有覆盖(实现)它继承的所有抽象方法,则该子类本身也是抽象的,必须这样声明

于 2013-08-03T06:21:54.400 回答
4

即使您不想实现该类实现的所有接口方法,也可以将类设为抽象。根据 java文档

需要注意的是,实现接口的类必须实现接口的所有方法。但是,可以定义一个不实现所有接口方法的类,前提是该类被声明为抽象类。

无论如何,您都无法实例化使用abstract声明的类。

于 2013-08-03T06:15:45.873 回答
4

可能不是。它会阻止“静态助手”类被实例化,但我认为以这种方式使用它会是一种糟糕的风格。

正如其他人所说,如果它打算成为一个基类——后代声明和实现接口/功能,这对于超类来说太具体了——那么abstract在超类中可能是合适的。

在这种情况下,它声明了 super 本身没有用,并且子类会做更多的事情——他们会特别声明。

于 2013-08-03T06:15:52.233 回答
3

非抽象类中不能有抽象函数!

因此,如果您出于某种原因在类中需要一个抽象函数,则必须将您的类声明为抽象类。

为什么我需要一个抽象函数?

使用抽象方法有什么意义?

如果一个抽象类可能不包含任何抽象方法。除了不能实例化抽象类之外,还有其他任何理由使类抽象吗

至于你的问题,我能想到的一个场景如下 -

假设您只需要一个类的静态功能。静态变量和函数。所以基本上你不希望用户创建你的类的任何实例。现在您可以将构造函数设为私有,从而排除创建实例的可能性,但您也不想这样做。为什么要编写额外的代码行?在这种情况下,您可以使您的类抽象。

于 2013-08-03T06:22:23.453 回答
2

我从为什么要将类声明为抽象类中提取以下几点?

  1. 抽象类通过阻止开发人员实例化基类来改善这种情况,因为开发人员已将其标记为缺少功能。

  2. 它还提供编译时安全性,因此您可以确保扩展抽象类的任何类都提供最低限度的功能来工作,并且您不必担心放置继承者必须以某种方式神奇地知道它们有的存根方法重写方法以使其工作。

于 2013-08-03T07:56:37.717 回答
1

抽象类充当其子类的模板。例如,抽象类 Tree 和子类 Banyan_Tree 具有树的所有特征以及榕树特有的特征。

理解抽象类和接口之间的区别是必不可少的。接口只有方法声明或抽象方法和常量数据成员,而抽象类可能有抽象方法、成员变量和具体方法。因为Java只支持单继承,一个类可以实现多个接口,但只能扩展一个抽象类。

于 2013-08-18T18:05:59.293 回答