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

基于Java8的抽象类和接口的区别

程序员文章站 2022-06-13 20:36:11
...

抽象类和接口有什么区别?这是一个出现频率非常高的问题,也是很容易忽略的问题。很多人可以凭借强悍的实战经验总结出来,但这种总结往往带有一些不完美。

相同点:都不能被实例化。
不同点:1.接口都是抽象方法,抽象类可以拥有方法实体。2.类只能单继承(extends),但是接口可以多继承(extends)。3.抽象类可以拥有各种数据类型,接口数据只能是静态(static)的常量(final)。

我相信上面这些区别稍微学过Java的人都应该知道的,也能非常流畅的答出来。但是如果基于Java8,上面这些真的还都成立吗?
上一组代码
这是接口(interface)代码

public interface OneInter {
    void foo1();
    default void foo2() {}
    static void foo3() {}
}

这是接口实现代码

public class TestMain implements OneInter {

    @Override
    public void foo1() {
    }
}

上面两段代码在Java8里面是不会报错的,default是Java8的一个新特性,接口可以拥有默认实现了。不知道你们发现没有,接口里面的方法我是用的缺省,没有用public来修饰,这也是Java8的一些改进,在接口(interface)里面,缺省==public。还有就是最后的静态(static)方法,接口(interface)静态(static)方法用法和一般的类(class)的用法一模一样的。

或许看到这里,你会有疑问了?既然接口(interface)都可以拥有方法的默认(default)实现和静态(statci)方法了,那么接口和抽象类真的还有区别吗?

答案是肯定的。语法差距确实越来越小了,但是在语言设计层面上依然有不可跨越的鸿沟。

Java是面向对象的语言,所有对象都抽象为类(class)来表达。抽象类(abstract class)本质上来说还是(class),也就是说抽象类(abstract class)是用来描述对象的,对对象进行了更高度化的抽象。那么接口(interface)呢?是对行为的抽象。在面向对象里面讲过,一个对象具有属性状态和行为动作。接口(interface)是行为抽象,永远只能是对象的一部分。

那么为什么要设计接口呢?

我的理解是:规范对象行为和多态。规范对象行为体现在,实现(implements)某个接口的类(class)看起来大同小异,感觉看着差不多,比如:LinkedList和ArrayList,看过源码的人应该都知道。多态是Java非常重要的特性,而接口为多态提供了语法层面的支持。

List list1 = new ArrayList();
List list2 = new LinkedList();
list1.clear();
list2.clear();

接口(interface)一般都只关注对象的具有哪些行为,而不关注对象的行为具体怎么实现的,这和多态不谋而合,我们使用多态的时候,侧重点也在对象的行为上面。

最后在讲一个很容易被人忽略但是也可以说明接口(interface)不是类(class)的事实,那就是接口(interface)能多继承(extends),看清楚是多继承(extends),不是多实现(implements)。
上一段代码证明。

public interface ThreeInter extends OneInter, TwoInter {
}
public class TestMain implements OneInter, TwoInter, ThreeInter {
    @Override
    public void foo1() {
    }
}

因为接口能够多实现,好像这种用法也没有太大的意义的,完全可以多实现(implements),比如我上面的代码,所以导致很多人可能忽略了这个事实。

如有疑问,欢迎留言!

相关标签: java 基础