我理解为什么我们需要Java中的Abstract Class - 来创建子类。但同样可以通过具体的课程来实现。例如Class Child扩展Parent。在这里父母很可能是抽象的&具体。那么为什么我们有抽象?
答案 0 :(得分:50)
抽象类无法直接实例化。将类声明为抽象意味着您不希望它被实例化,并且该类只能被继承。您在代码中强加了一条规则。
如果你进一步扩展你的父/子关系例子以包含一个Person类,那么Person是抽象的很有意义。父母是一个具体的想法,孩子也是。人是现实中以及代码中的抽象概念。
一个好处是你明确定义和保护抽象类的想法。当您将类声明为抽象时,您或其他任何使用您的代码的人都无法通过实例化错误地使用它。这种推理类似于我们将函数和字段指定为public,private或protected的原因。如果您将一个函数或成员声明为私有,则实际上是保护它免受来自客户端代码的不正当访问。私有化意味着在课堂上使用,就是这样。抽象类是继承的,就是那样。
现在,您是否必须使用抽象类并将函数和字段定义为私有而非公共? 不,你没有。但是提供这些概念是为了帮助保持代码清洁和组织良好。根据我的知识,抽象类以所有面向对象的语言实现。如果你环顾四周,你会看到C ++,C#,VB.NET等都使用这个概念。
更好,具体的例子:
在上面的示例中,Shape类应该是抽象的,因为它本身没有用。
答案 1 :(得分:6)
抽象类意味着抽象不完整。它需要另一个类来完成它和/或它的功能。您需要扩展抽象类。它对某些类有用,例如。水果所有水果都具有相同的颜色属性。但是你可以为不同的水果提供不同的特性,例如橙子或不是香蕉等,例如香蕉等。
答案 2 :(得分:4)
我知道这是一个老问题,但看起来海报仍然有一些关于使用抽象类的好处的问题。
如果您是唯一一个会使用您的代码的人,那么确实没有任何好处。但是,如果您正在为其他人编写代码,则可以获益。比方说,您已经编写了一个缓存框架,但希望允许客户端创建自己的缓存实现类。您还希望跟踪一些指标,例如假设有多少缓存是开放的。您的抽象类可能如下所示:
public abstract class AbstractCache {
public final void open() {
... // Do something here to log your metrics
openImpl();
}
protected abstract void openImpl() { }
}
它自己的AbstractCache类是没用的,你不希望客户端尝试实例化一个并将它用作缓存,如果这个类是具体的,它们就能做到。您还希望确保它们不能绕过您的度量日志记录,如果您只是为它们提供了一个Cache接口,他们就可以做到这一点。
答案 3 :(得分:3)
抽象点不是创建子类。它更多的是在代码中创建Seams。您希望代码可以测试并解耦,从而实现可维护性的最终目标。出于类似的原因,抽象还使我们能够在不产生副作用的情况下替换一些代码。
答案 4 :(得分:3)
抽象类旨在用作从中派生其他类的基类。派生类应该为未在基类中实现的方法提供实现。实现所有缺失功能的派生类称为具体类
答案 5 :(得分:0)
根据我的理解
抽象类 是一个只描述行为但不实现它的类。 考虑抽象类的这个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中的具体类是任何这样的类,它可以从接口或抽象类实现其所有继承成员。
答案 6 :(得分:0)
对于那些只寻求纯技术方法差异的人,具体的父类和抽象的父类之间最明显的区别是义务,让孩子包括/实现特定的方法。
具体的父类不能强迫/强迫其子类包括/实现一种方法。抽象的父类通过声明抽象方法来强制其子代这样做。
除上述内容外,还要求设计和功能要求指示抽象类的使用。这样的示例可以在javax.servlet.http.HttpServlet
类中找到