Java 只有抽象方法和接口的抽象类-我应该使用哪个?

Java 只有抽象方法和接口的抽象类-我应该使用哪个?,java,design-patterns,interface,abstract-class,design-principles,Java,Design Patterns,Interface,Abstract Class,Design Principles,请注意。这个问题不是一个抽象的类与接口的问题 对。我知道。扩展抽象类的类不必重写其所有未实现的方法。如果子类没有定义其父类的一些未实现的方法,那么子类也将被认为是抽象的 但是实现接口的类应该实现其所有方法(接口也可以实现多重继承) 这是只有抽象方法的抽象类和接口之间的唯一区别吗 是的,我明白。抽象类可以有状态和方法实现。 但我把问题说得很清楚。它实际上不是一个接口与抽象类的问题 在这里,在这个问题中,抽象类没有任何数据成员或任何方法实现。只是一些抽象的方法而已。 例如: 我只是想知道是否还有其他

请注意。这个问题不是一个抽象的类与接口的问题

对。我知道。扩展抽象类的类不必重写其所有未实现的方法。如果子类没有定义其父类的一些未实现的方法,那么子类也将被认为是抽象的

但是实现接口的类应该实现其所有方法(接口也可以实现多重继承)

这是只有抽象方法的抽象类和接口之间的唯一区别吗

是的,我明白。抽象类可以有状态和方法实现。 但我把问题说得很清楚。它实际上不是一个接口与抽象类的问题

在这里,在这个问题中,抽象类没有任何数据成员或任何方法实现。只是一些抽象的方法而已。 例如:

我只是想知道是否还有其他差异。 在这种情况下,我应该使用什么


请帮忙。

我相信界面在软件设计中有更多的用途。 您可以将组件实现与接口解耦,以便在更改代码时具有更大的灵活性,同时降低风险。 就像控制模式的反转,您可以使用接口,然后当您决定可以更改您想要使用的具体实现时。
接口的其他用途是,您可以使用interfaces()拦截器执行不同的操作,但这些操作并非都是可行的,或者至少使用抽象类是简单的。

我相信您的问题不一定是一个对另一个,而是如何知道在一个实例中选择哪一个

我喜欢考虑的一种方式是,接口往往是用户可用于与类接口的操作。例如,如果一个类实现了接口playable,您知道它将有一个播放方法,它是启动音频播放器、启动视频还是启动游戏将取决于该类本身,但您只知道它是一个可播放类,并且可以播放

虽然形状不是一个动作,它是一种类型,但形状随属性一起定义它,你需要知道颜色、大小等,才能知道什么是形状。这就是为什么我会使用一个抽象类来定义它们共同拥有的所有属性

因为draw()是一种可以应用于形状、图像或场景的功能,所以我将它实现为一个
可绘制的接口

示例:

 public class Square extends Shape implements Drawable{

      public void draw(){
          //draw code here
      }
 }

通过这种方式,您可以定义
Shape
内部的所有公共属性,并提供通过可绘制接口绘制自身的功能。

您在此处所述的情况(当接口和抽象类都只有方法签名,而抽象类没有任何方法的部分实现时)我甚至更喜欢界面。由于抽象类没有
draw()
方法的任何规范,也没有字段/属性,因此它实际上是一个接口,存在一个问题,即强制子类不要继承其他必需的类。考虑下面的代码片段-

public class AnySubClass extends Shape{}
现在,
AnySubClass
不能扩展任何其他子类。但是如果
Shape
是一个接口,那么
AnySubClass
可以实现其他接口,或者可以扩展其他一些重要的类


在一般情况下,接口允许您自由地实现该方法—以自己的方式实现,但必须实现。但在这种情况下,当您想为您的子类提供一些如何实现的指南时,应该使用抽象类。此外,您还可以实现多个接口

在这里,我想说的是,与其说是正方形,还不如说是形状。非常感谢。@Sikorski,是的,我同意,但为了理解,在我看来简单是最好的。一旦理解了主要概念,他就可以进行重构,并学习如何越来越多地改进。由于我对行为和结构设计模式还没有完全了解,我一直在努力理解整个想法。无论如何,我会深入调查的。非常感谢你给了我正确的方向。谢谢拉兹布!这正是我的想法!无论如何,谢谢你说得更清楚。:)
public class AnySubClass extends Shape{}