Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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_Interface_Abstract Class - Fatal编程技术网

Java 是否存在一种抽象类优先于接口的场景

Java 是否存在一种抽象类优先于接口的场景,java,interface,abstract-class,Java,Interface,Abstract Class,我有一个场景,其中有几个具有类似实现的子类,以及一些额外的方法,每个子类的实现都不同。我认为对于这种情况,抽象类是一个不错的选择。但是,如果抽象类实现一个包含所有方法声明的接口会更好吗?或者我应该只使用抽象类 简而言之,我想知道在哪些情况下我更喜欢层次结构顶部的抽象类而不是接口。记住,使用抽象类,可以定义子类拥有的数据。使用接口,您只能定义实现者必须实现的方法。那么,在您的情况下,您需要公共数据和公共方法还是只需要公共方法 如果您的子类与抽象类有is-a关系,则使用抽象类 您可以同时拥有一个抽象

我有一个场景,其中有几个具有类似实现的子类,以及一些额外的方法,每个子类的实现都不同。我认为对于这种情况,抽象类是一个不错的选择。但是,如果抽象类实现一个包含所有方法声明的接口会更好吗?或者我应该只使用抽象类


简而言之,我想知道在哪些情况下我更喜欢层次结构顶部的抽象类而不是接口。

记住,使用抽象类,可以定义子类拥有的数据。使用接口,您只能定义实现者必须实现的方法。那么,在您的情况下,您需要公共数据和公共方法还是只需要公共方法

如果您的子类与抽象类有is-a关系,则使用抽象类

您可以同时拥有一个抽象类和一个接口——抽象类指定实现,接口指定API


集合框架就是一个例子,它有
ArrayList扩展AbstractList实现List

一个抽象类不必是完全抽象的。您可以定义所有子类都将按原样使用的某些函数(和变量),并且只保留由子类实现的某些方法。接口具有无法定义函数的限制


另一方面,接口允许类灵活地实现多个接口,而一个类只能扩展另一个类。从这个意义上讲,接口可能总是比纯抽象类更可取。但是抽象类仍然有很多用途,其中确实包含一些重用的功能。

抽象类可以提供接口无法提供的默认行为。当行为的一部分在几个子类中是常见的时,这是有意义的


模板方法模式很好地利用了这一点:它减少了顺序耦合。

抽象类允许您携带一些代码/数据,然后可以在继承的类中使用这些代码/数据。它们在这方面很好,但很少使用继承。仅当新类与抽象类完全可互换时,才从类继承

接口不包含代码

只要可能,我更喜欢编写接口代码。我也喜欢尽可能地保持这些接口小。这使我可以灵活地在以后替换底层的执行

如果编写抽象类的代码,那么以后很难交换实现


您可以将一个接口(或几个小接口)应用于抽象类。听起来这可能是你最好的方法。

总是喜欢界面。你应该尽量避免抽象类。尽管如此,抽象类在类似于java集合的图书馆代码中占有一席之地。在这些地方,您正在构建专门为扩展而设计的类,尤其是从质量的角度来看,整合行为非常有价值。

阅读此:或此:或与此相同的其他一百个问题中的任何一个。具有相同实现的常见方法甚至没有必须使用相同的实现。例如,子类可能会覆盖基类中函数的实现。是的,我知道我可以同时拥有抽象类和接口,但这是最好的方法吗??在这里,他们只使用抽象类游戏,而不使用抽象类和接口。你知道为什么会这样吗。有什么好处吗?有道理。但是,如果我添加一个接口(比如GameInterface)并在那里执行所有的方法声明,然后让抽象类Game实现GameInterface,那么设计中是否存在任何缺点。这个问题只是出于好奇。感谢这实际上是一种常见的做法。例如,您将在java的API中看到很多这类内容。但在这种情况下,基于组合的模式(例如decorator)通常是更好的解决方案。