使用没有任何抽象方法的抽象类

时间:2013-08-03 06:10:48

标签: java abstract-class abstract

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

除了抽象类无法实例化这一事实之外,是否还有其他原因可以使类抽象化?

7 个答案:

答案 0 :(得分:9)

抽象类意味着类的定义不完整,因此无法实例化。尽管它没有抽象方法,但它是一个指示符,该类可用于继承。即使它具有其中所有方法的实现,但实现可能仍然不完整,并且必须被扩展类覆盖。

答案 1 :(得分:4)

即使您不想实现类实现的所有接口方法,也可以将类创建为 abstract 。 根据java docs

  

有人指出,实现接口的类必须实现所有接口的方法。但是,如果声明该类是抽象的,则可以定义一个不实现所有接口方法的类。

任何方式都无法实例化使用 abstract 声明的类。

答案 2 :(得分:4)

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

正如其他人所说,如果它打算成为一个基类 - 后代宣称&实现接口/功能,这对于超类来说太具体了 - 那么abstract可能适合超类。

在这种情况下,它是一个声明,超级对它自己没用,并且子类将做更多的事情 - 他们将特别声明。

答案 3 :(得分:4)

抽象类的主要作用是提供一个适当的根类,从中可以派生出具体的(即非抽象的)子类。这是一个功能强大且功能多样的功能,可以促进代码重用。抽象类封装了一系列数据类型通用的一般特性 - 这些特性在抽象类中过于笼统而无意义,但可以在子类中重写

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

无法实例化抽象类 - 换句话说,您无法创建抽象类的实例(对象)

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

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

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

答案 4 :(得分:3)

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

因此,如果您因为某种原因需要在课堂上使用抽象函数,则必须将您的类声明为抽象。

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

What is the point of using abstract methods?

  

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

至于你的问题,我能想到的情况如下 -

  

让我们说你需要的只是一个类的静态功能。静态变量和函数。所以       基本上你不希望用户创建你的类的任何实例。现在你可以做你的       构造函数私有因此排除了创建它的实例的可能性,但你没有       我也想这样做。为什么要写额外的代码行?在这种情况下,您可以将您的班级抽象化。

答案 5 :(得分:2)

我从Why should I declare a class as an abstract class?

中提取了以下几点
  1. 抽象类通过阻止开发人员来改善这种情况 实例化基类,因为开发人员已经标记了它 由于缺少功能。

  2. 它还提供编译时安全性,以便您可以确保扩展抽象类的任何类提供最低限度的工作功能,并且您不必担心将继承者以某种方式放置的存根方法神奇地知道他们必须覆盖一个方法才能使它发挥作用。

答案 6 :(得分:1)

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

理解抽象类和接口之间的差异至关重要。接口只有方法声明或抽象方法和常量数据成员,而抽象类可能有抽象方法,成员变量和具体方法。因为Java仅支持单继承,所以类可以实现多个接口,但只能扩展一个抽象类。