在探究它们中间的不相同点以前,大家先看看抽象类、接口各自的特点。

抽象类

抽象类是用来捕捉子类的通用本性的
。它不能被实例化,只好被充任子类的超类。抽象类是被用来创设继承层级里子类的模板。以JDK中的GenericServlet为例:

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    // abstract method
    abstract void service(ServletRequest req, ServletResponse res);

    void init() {
        // Its implementation
    }
    // other method related to Servlet
}

当HttpServlet类世襲GenericServlet时,它提供了service方法的兑现:

public class HttpServlet extends GenericServlet {
    void service(ServletRequest req, ServletResponse res) {
        // implementation
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        // Implementation
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        // Implementation
    }

    // some other methods related to HttpServlet
}

何以时候利用抽象类和接口

  • 假如你富有一点方式何况想让它们中的一些有暗许达成,那么使用抽象类吧。
  • 只要你想达成多种世袭,那么您必须要运用接口。由于Java不辅助多三回九转,子类不可知继承多少个类,但能够完毕八个接口。由此你就足以选取接口来缓慢解决它。
  • 新澳门31999,设若基本效用在一再变动,那么就须要运用抽象类。如若持续改变幼功效并且选用接口,那么就需求更改全部达成了该接口的类。

接口

接口是空虚方法的晤面。假使二个类达成了有些接口,那么它就持续了那些接口的架空方法。这如同合同方式,如果实现了那一个接口,那么就务须确认保证使用这个方式。接口只是黄金时代种情势,接口本人不可能做其余专门的学业。以Externalizable接口为例:

public interface Externalizable extends Serializable {

    void writeExternal(ObjectOutput out) throws IOException;

    void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}

当你完毕那个接口时,你就必要达成地方的多少个格局:

public class Employee implements Externalizable {

    int employeeId;
    String employeeName;

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        employeeId = in.readInt();
        employeeName = (String) in.readObject();

    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {

        out.writeInt(employeeId);
        out.writeObject(employeeName);
    }
}

大多大规模的面试题都会出诸如抽象类和接口有啥样区别,什么情形下会利用抽象类和怎么境况你会接受接口如此那般的标题。本文大家将紧凑商讨那几个话题。

抽象类和接口的比较

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

Java第88中学的默许方法和静态方法

Oracle已经上马尝试向接口中引入暗许方法和静态方法,以此来压缩抽象类和接口之间的间隔。今后,大家得以为接口提供暗许完毕的点子了并且心甘情愿子类来落到实处它。那类内容本人就要下篇博客进行阐释。

发表评论

电子邮件地址不会被公开。 必填项已用*标注