Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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,我现在正在学习java,我正在学习抽象语言。 我读到了有一个抽象类的奇怪部分 不包括任何Abstract方法 他们为什么使用这种课程 以防止该类的实例化,并将其仅用作基类。子类可以使用抽象类中定义的常规方法 例如,创建AbstractVehicle的实例是没有意义的。但是所有的车辆都可以重用一个通用的registerLeage(int)方法。我想不出有什么好的理由使用它。它可以用作“标记”,但接口将是更好的选择。如果该类扩展了另一个抽象类,并且没有继承的抽象方法的实现。该类包含其所有继承者的一些

我现在正在学习java,我正在学习抽象语言。 我读到了有一个抽象类的奇怪部分 不包括任何Abstract方法


他们为什么使用这种课程

以防止该类的实例化,并将其仅用作基类。子类可以使用抽象类中定义的常规方法


例如,创建
AbstractVehicle
的实例是没有意义的。但是所有的车辆都可以重用一个通用的
registerLeage(int)
方法。

我想不出有什么好的理由使用它。它可以用作“标记”,但接口将是更好的选择。

如果该类扩展了另一个抽象类,并且没有继承的抽象方法的实现。

该类包含其所有继承者的一些公共逻辑,但它本身并不表示可用的实体(就特定应用而言)这样做的一个常见原因是让
抽象类提供
抽象方法的爆炸式实现,以方便不必实现所有
抽象方法的子类,只是那些他们想要的——其余的仍然会爆炸,但如果不执行这些执行路径,这并不重要


是这种模式的一个实例。对于处理不同请求类型的所有方法,它都有默认实现,但它们都会引发异常。如果子类想做一些有意义的事情,就必须重写这些。只要不调用某些处理程序方法,就可以不重写它们。

这些类型的类用于实现可由其他类实现的通用逻辑。将其抽象化可以防止实例化它。但是其他类可以继承该类及其方法。

假设您有一组相关的类,但还没有相关(共享)代码。如果我们让所有这些类都扩展一个没有抽象方法的基类,那么如果我们不想让所有这些类将来都有一个相同的方法/特性,那么可以通过将它放在基类中一次性完成。因此,代码不会重复,它只在一个位置包含它,从而反映在所有子类中。

没有抽象方法的抽象类意味着您可以创建该抽象类的对象。 看我的例子

abstract class Example{
void display(){
 System.out.println("Hi I am Abstract Class.");
}
}
class ExampleDemo 
{
public static void main(String[] args) 
{
Example ob = new Example(){};
ob.display();
}
}
若您在抽象类中编写一个抽象方法,那个么它将不会编译。
这意味着,如果您创建的抽象类没有抽象方法,那么您可以创建该抽象类的对象。

我开发了一个抽象类,以防止该类实例化,并将其仅用作基类。因为,这些类型的类用于实现可以由其他类实现的通用逻辑。有时,抽象类中的每个方法都有一个默认实现。在这种方式下,它不会强制子类重写所有的方法,但也会实现所有需要的方法。这意味着隐式地您必须重写至少一个方法,才能使用这个抽象类生成场景

是的,我们可以有抽象类,而不需要任何抽象方法。
没有任何抽象方法的抽象类的最佳示例是HttpServlet

拥有此类的另一个示例是在实现创建助手时。这些类用于简化客户机创建对象的过程,这些对象在主题中是相关的,但根据需要是解耦的。从本质上讲,这个creator类的方法都是静态的,它们也可以看作是实用类。显然,这个类的安装是无效的,因此使用了
abstract
关键字


提到我最近遇到的一个例子是
org.springframework.integration.dsl.Sftp
中的
Sftp
类,它基本上是一种简单的方法,可以从sftpapi中请求对象(例如:适配器、网关)。

在这种情况下,它意味着类确实具有抽象方法,无论继承与否,因此,实际上必须将其声明为
abstract
。问题在于,如果从类声明中去掉
abstract
关键字,编译器不会抱怨的情况。@Costi Ciudatu yes。但是没有声明。+1我认为一个“规范”的例子应该是
javax.servlet.HttpServlet
,它是
抽象的,但没有抽象方法。该类的设计者根本不想让您在web.xml中注册一个
HttpServlet
,因为它根本没用。如果我在抽象类之外创建一个匿名内部类怎么样?通过这种方式,我可以实例化抽象类而不改变其中的任何内容。因为它是关于“无抽象方法”,这意味着该类为其整个行为提供了默认实现,因此接口根本不是替代品,恰恰相反。@Costi Ciudatu:当然。恐怕我把它误解为“没有方法”,将一个类声明为抽象而实际上没有抽象方法是完全错误的设计选择。一开始就让人困惑。为什么会有人这样做?@panzerschreck:以Bohemian的答案(或我对Bozho答案的评论)为例。一个无用的类在调用它的任何方法时抛出异常是“无用的”-一个接口应该是最好的选择:)。不是吗?在JDK1.00中,抽象类中需要一个抽象方法。1.1放宽了这一限制,并添加了类,如
java.awt.event.KeyAdapter
。您的示例没有创建抽象
example
类的实例。它创建了一个非抽象匿名内部类的实例,该类
扩展了Example
。编译程序并查看编译器生成的.class文件。你会明白我的意思。此外,那最多也只是一个不稳定的副作用。如果说这意味着“……你可以创建那个抽象类的对象”,那将是一个危险的命题,贝卡