抽象类与具体类有何不同?

我理解为什么我们需要Java中的Abstract Class – 来创建子类。 但同样可以通过具体的课程来实现。 例如,Child Child扩展Parent。 在这里,父母可以很好地抽象和具体。 那么为什么我们有抽象?

抽象类无法直接实例化。 将类声明为抽象意味着您不希望它被实例化,并且该类只能被inheritance。 您在代码中强制执行规则。

如果你进一步扩展你的父/子关系例子以包含一个Person类,那么Person是抽象的很有意义。 父母是一个具体的想法,孩子也是。 人是现实中以及代码中的抽象概念。

一个好处是您明确定义和保护抽象类的想法。 当您将类声明为抽象时,您或其他任何使用您的代码的人都无法通过实例化错误地使用它。 这种推理类似于我们将函数和字段指定为public,private或protected的原因。 如果您将某个函数或成员声明为私有,则实际上是保护它免受来自客户端代码的不正当访问。 私有化意味着在课堂上使用,就是这样。 抽象类意味着inheritance,就是这样。

现在, 您是否必须使用抽象类并将函数和字段定义为私有而不是公共? 不,你没有 。 但提供这些概念是为了帮助保持代码清洁和组织良好。 根据我的知识,抽象类以所有面向对象的语言实现。 如果你环顾四周,你会看到C ++,C#,VB.NET等都使用这个概念。

一个更好,更具体的例子:

形状层次结构UML图

在上面的例子中,Shape类应该是抽象的,因为它本身没有用。

抽象类意味着抽象不完整。 它需要另一个类来完成它和/或它的function。 您需要扩展抽象类。 它对某些类有用,例如。 水果所有水果都具有相同的颜色属性。 但是你可以为不同的水果提供不同的特性,比如它是不是像橙子一样稀烂,例如香蕉等。

我知道这是一个老问题,但看起来海报仍然有一些关于使用抽象类的好处的问题。

如果你是唯一一个会使用你的代码的人,那么确实没有任何好处。 但是,如果您正在为其他人编写代码,那么就会有一个好处。 比方说,您已经编写了一个缓存框架,但希望允许客户端创建自己的缓存实现类。 您还希望跟踪一些指标,例如假设有多少缓存是打开的。 您的抽象类可能如下所示:

public abstract class AbstractCache { public final void open() { ... // Do something here to log your metrics openImpl(); } protected abstract void openImpl() { } } 

就其本身而言,AbstractCache类是无用的,您不希望客户端尝试实例化一个并将其用作缓存,如果该类是具体的,它们将能够执行此操作。 您还希望确保它们不能绕过您的度量日志记录,如果您只是为它们提供了一个Cache接口,他们就可以做到这一点。

抽象点不是创建子类。 它更多的是在代码中创建Seams。 您希望代码可以进行测试和解耦,从而实现可维护性的最终目标。 出于类似的原因,抽象还为我们提供了替换一些代码而不会产生副作用的能力。

抽象类旨在用作从中派生其他类的基类。 派生类应该为未在基类中实现的方法提供实现。 实现所有缺失function的派生类称为具体类

根据我的理解

Abstract Class是一个只描述行为但不实现它的类。 考虑抽象类的这个Java示例:

 public interface DoSomething(){ public void turnOnTheLight(); } 

具体类是要实现的类。 例如:

  public abstract class A(){ public void doIt(); } public class B extends A(){ public void doIt(){ //concrete method System.out.println(“I am a Concrete Class Test”); } } 

换句话说,java中的具体类是任何这样的类,它从接口或抽象类中实现其所有inheritance成员。