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

17 篇文章 0 订阅

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

相同点:都不能被实例化。
不同点: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),比如我上面的代码,所以导致很多人可能忽略了这个事实。

如有疑问,欢迎留言!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值