Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何知道类何时应该是抽象的?_Java - Fatal编程技术网

Java 如何知道类何时应该是抽象的?

Java 如何知道类何时应该是抽象的?,java,Java,我很难选择一个类是具体的还是抽象的。另外,我不知道在层次结构中什么时候事情变得具体或抽象。我的问题是,我们如何确定一个类应该是抽象的还是具体的类 当所有子类都有一个共同的行为时,应该有一个具体的方法 例如,车辆是一个抽象类,那么它是由燃料驱动的。这将是所有车辆(自行车除外)的常见行为,因此应采用具体方法进行描述,其他功能,如等级(2轮/4轮)、行驶细节(里程0-20/0-80)、动力细节(100cc-400cc)将因车辆而异,因此应采用抽象方法。一般而言,当您完全没有理由创建某个类的实例时,该类

我很难选择一个类是具体的还是抽象的。另外,我不知道在层次结构中什么时候事情变得具体或抽象。我的问题是,我们如何确定一个类应该是抽象的还是具体的类

当所有子类都有一个共同的行为时,应该有一个具体的方法


例如,车辆是一个抽象类,那么它是由燃料驱动的。这将是所有车辆(自行车除外)的常见行为,因此应采用具体方法进行描述,其他功能,如等级(2轮/4轮)、行驶细节(里程0-20/0-80)、动力细节(100cc-400cc)将因车辆而异,因此应采用抽象方法。

一般而言,当您完全没有理由创建某个类的实例时,该类应该是抽象的。例如,假设您有一个Shape类,它是三角形、正方形、圆形等的超类。由于“Shape”非常通用,因此不应该有任何理由构造Shape对象,因此它应该是抽象的(或者甚至是一个接口)。

抽象类的意思是它是抽象的,而不是完整的。它需要另一个类来完成它和/或它的功能。您需要扩展抽象类

选择抽象类时,需要记住的几件事:

  • 您希望永远不要实例化该类
  • 您希望继承该类
  • 该类不完整,继承类必须完成其定义(通过重写抽象类的抽象方法)
将抽象类视为普通类,其某些方法将在稍后定义


例如,您希望访问数据库,但不知道将使用哪个数据库。因此,您需要对打开连接、启动事务、访问数据库、关闭事务和释放连接的部分进行编码。但是您没有实现获取连接的部分,因为该部分是特定于数据库的。因此,例如,访问MySQL的人会扩展您的类,并且只需要实现获取连接的部分。

在我看来,抽象类和具体类之间的唯一区别是抽象类不能“新建”

您可以将抽象关键字放在具体类之前,以阻止其他人新建该类的对象。 (抽象类不必具有抽象方法)


我建议您使用接口而不是抽象类,因为Java是单继承,一个类只能有一个超类,但可以实现多个接口。

一个抽象类是不错的选择:

  • 如果您认为您将计划使用继承,因为它为派生类提供了公共基类实现
  • 如果您希望能够声明非公共成员
  • 如果您认为将来需要添加方法
  • 当您需要一些具有定义的方法时–因此抽象类可以具有具有实际实现细节的非抽象方法
  • 但是请记住,抽象类不能实例化。它只能用作扩展抽象类的其他类的超类

  • 如果你能提供一个,如果你想得到一般性的答案,那就好了。同意你的例子,为它使用接口不是更好的选择吗?不,因为接口将无法保存示例的样板代码。所以可以肯定地说,抽象类是我们感官无法感知的类?就像形状一样,它只是作为一个概念而不是一个实际的物体存在。这听起来很安全。尽管,例如,您可能有一个抽象类“Car”,其中包含具体的子类,如“Truck”或“Jeep”