Java基础之抽象类与接口

在工作中我们并不会经常用到抽象类,或者即使使用到了也只是在遵从整个项目的架构而在生成接口。例如我们经常看到许多公司的项目中大量service实际上没有多种实现,却将Service分为了service抽象类和implement实现类两个文件。这是一件需要权衡利弊的问题,而不是应该遵从大流。

先一起来看一下这些抽象的方法与类的使用吧

抽象类

作用:如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,这时可以使用抽象类。抽象类相当于一个“规范”,让继承于它的类必须实现某些方法。如下为一个抽象类的例子:

abstract class Person {
    public abstract void run();
}

抽象类无法直接实例化 (Person p = new Person();),但是它的好处也是显而易见的,我们可以灵活的使用多态去做更多有趣的事情,例如我们建立了Person类的两个子类:Student和Teacher类:

Person s = new Student();
Person t = new Teacher();
s.run();
t.run();

我们可以发现,即使我们不知道Student和Teacher类中实现了哪些方法,同样可以使用Person抽象类中定义的方法。

接口

可以看作是一种特殊的抽象类,所有的方法都没有实现而只有定义,此时我们可以用interface修饰此类。在java8之前,interface中无法定义任何方法的方法体,而在1.8版本开始,我们拥有了default方法:

interface Person {
    String getName();
    default void run() {
        System.out.println(getName() + " run");
    }
}

此方法由于在interface中,所以无法访问任何实例字段。

对比

abstruct class interface
继承 只能extends一个class 可以implements多个interface
字段 可以定义实例字段 不能定义实例字段
抽象方法 可以定义抽象方法 可以定义抽象方法
非抽象方法 可以定义非抽象方法 可以定义default方法

总结

抽象类和接口的作用都是为了给继承/实现它的类提供规范,将一些有共性的方法给抽象提取出来。当再次产生另一种类似对象时,我们也能够使用相同规范去处理,这是一种更加合理的设计。

你可能感兴趣的:(Java,接口,抽象类,对比)