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

时间:2012-04-18 14:17:42

标签: java class abstract

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

7 个答案:

答案 0 :(得分:50)

抽象类无法直接实例化。将类声明为抽象意味着您不希望它被实例化,并且该类只能被继承。您在代码中强加了一条规则。

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

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

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

更好,具体的例子:

Shape hierarchy UML Diagram

在上面的示例中,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类中找到