对于Java8新特性——接口的默认方式的小白理解

由于我还只是一个学生,本文内容只是我刚刚学习了Java8新特性以后对接口的默认方式的一些个人理解或者说是对我个人比较赞同的网上看到的言论。

Java8在接口的默认方式上面允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法。

举个简单的例子
在这里插入图片描述
Formula接口在拥有cal方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个cal方法,默认方法sqrt将在子类上可以直接使用。
原来在Java中只能单继承,这个新特性的出现使得我们如果不方便在老的代码上添加新的抽象方法,或者子类的实现其实都一样,可以在接口上直接添加默认方法,子类也拥有该方法的功能。

默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。这句话差不多官网对于新特性解释的原文。

官网对于新特性解释链接:接口的默认方式

那么它的优缺点是什么呢?

优点是,它使得接口变得更智能,同时还避免了代码冗余,并且扩展类库。

缺点是,有些人可能在接口方法里获取this引用然后强制转化成某个具体类型的写法了。而且在代码层级很复杂的情况下很容易自己弄错导致代码发生错误。

由于同一个方法可以从不同接口引入,自然而然的会有冲突的现象,规则如下

1、一个声明在类里面的方法优先于任何默认方法(即“类优先原则”)

若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时
1)选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略
2)接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突

2、优先选取最具体的实现

注意事项
扩展方式不能重写object中的方法,但是可以重载object中的方法
比如:toString、equals、hashCode不能在接口中被覆盖但是可以被重载。

为什么不能用默认方法来重载equals,hashCode和toString?
因为如果可以会很难确定什么时候该调用接口默认的方法。而且如果一个类实现了一个方法,那总是优先于默认的实现的。一旦所有接口的实例都是Object的子类,所有接口实例都已经有对equals、hashCode、toString等方法非默认 实现。因此,一个在接口上的这些默认方法都是没用的,它也不会被编译。(简单地讲,每一个java类都是Object的子类,也都继承了它类中的equals、hashCode、toString方法,那么在类的接口上包含这些默认方法是没有意义的,它们也从来不会被编译。)

默认方法和抽象方法的区别
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法)

抽象类与接口的异同
相同点:
1)都是抽象类型;
2)都可以有实现方法(以前接口不行);
3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)

不同点:
1)抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);
2)抽象类和接口所反映出的设计理念不同。
3)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

参考链接:https://www.jianshu.com/p/0bf8fe0f153b
https://blog.csdn.net/sun_promise/article/details/51220518

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值