欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

接口和抽象类的异同

程序员文章站 2022-03-26 10:49:57
前言 这是2019年的第一篇博客,开始复习整理一下JavaSE的知识点(其实差不多是预习了,参照网上大佬的博客搬运了示例代码QAQ),写的比较简陋见笑了。。 正文 首先分别概括一下什么是接口和抽象类。 接口:简单说就是一系列抽象方法的集合,如果一个类实现(implements)了某个接口,即继承了这 ......

前言

这是2019年的第一篇博客,开始复习整理一下javase的知识点(其实差不多是预习了,参照网上大佬的博客搬运了示例代码qaq),写的比较简陋见笑了。。

正文

首先分别概括一下什么是接口和抽象类。

接口:简单说就是一系列抽象方法的集合,如果一个类实现(implements)了某个接口,即继承了这个接口的所有抽象方法,则该类必须实现这些抽象方法。
demo

//接口externalizable
public interface externalizable extends serializable {

    void writeexternal(objectoutput out) throws ioexception;

    void readexternal(objectinput in) throws ioexception, classnotfoundexception;
}

//实现externalizable接口的employee类
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),因此可以把抽象类看作是提供给继承的子类的一个模板。抽象类本身没有任何用处,它是为了继承而存在的,创建一个抽象类而不去继承它等于是做了无用功。
demo

//实现...接口的抽象类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
}

//继承genericservlet抽象类的httpservlet子类
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
}

两者对比

参数 接口 抽象类
构造方法 不能有 可以有
方法 只能有抽象方法 可以包含普通方法
继承 一个类可实现多个接口 只能继承一个抽象类
成员变量 只能是public static final类型 可以是各种类型

接口和抽象类分别适用于何种场合?这里搬运网上某大佬博客里的一个例子。
门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

//抽象类
abstract class door {
    public abstract void open();
    public abstract void close();
}
//接口
interface door {
    public abstract void open();
    public abstract void close();
}

现在需要部分门具有报警alarm( )的功能,该如何实现?

  1. 将三个功能都放在抽象类中,但是有的门并不具备报警的功能 ×
  2. 将三个功能都放在接口中,有些类需要实现报警的功能但是并不具备open和close的功能(如火灾报警器)×
  3. 从1和2中可以看出,open和close是门的固有属性,而alarm则是特殊的附加属性,因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承door类和实现alarm接口。√
interface alram {
    void alarm();
}

abstract class door {
    void open();
    void close();
}

class alarmdoor extends door implements alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
}

参考: