只需低头努力,剩下的交给时光,时间会公平地帮你处理这一切
今天在看Spring源码的时候,无意中发现了接口中竟然可以写具体的方法实现,这让我感到有点意外,在我的定义中接口只能写抽象方法,是不能进行具体实现的,有没有跟我一样想法的小伙伴
然后看到方法前面用default关键字修饰了,就查了一下default关键字的用法,果然又get到新技能了
请原谅我的无知,用了很多年的Java竟然不知道还可以这么用,学无止境啊~~~
什么是default方法
在以前的JDK版本中,接口中是不能实现方法的,所有的实现必须交给子类来实现,这样会存在一个问题
假如你的接口被很多个开发者实现,那么你要升级接口并且新增方法时,就很痛苦了
所有实现了你接口的开发者都需要兼容你的新接口,这势必带来很多开发上的成本,好在Java8中引入的default关键字
Java8中可以在接口中直接实现方法,并且跟子类的方法保持兼容,这很重要
可以在接口中实现default方法,作为默认的实现
子类可以选择覆盖,也可以直接使用默认的实现,这样就不会导致子类要强行实现接口中的方法
看个例子吧
我们定义了一个登录的接口(LoginService),有两个具体的实现PCLoginService、APPLoginService,分别表示PC登录和APP登录
public interface LoginService {
public void login();
}
public class PCLoginService implements LoginService {
@Override
public void login() {
System.out.println("PC Login");
}
}
public class APPLoginService implements LoginService {
@Override
public void login() {
System.out.println("APP Login");
}
}
假如我现在接口升级,需要增加一个退出登录的方法,代码如下:
public interface LoginService {
public void login();
public void loginOut();
}
加了loginOut()方法后,所有的实现类都必须要实现这个方法
public class PCLoginService implements LoginService {
@Override
public void login() {
System.out.println("PC Login");
}
@Override
public void loginOut() {
}
}
public class APPLoginService implements LoginService {
@Override
public void login() {
System.out.println("APP Login");
}
@Override
public void loginOut() {
}
}
所有的实现者都要实现新增的方法loginOut(),这里只有两个实现者,假如有一百个实现者呢?那么大家都要跟着你的接口来改
用default方法,就可以避免这个问题
public interface LoginService {
public void login();
default public void loginOut(){
System.out.println("logintOut default");
}
}
把loginOut()方法用default关键字修饰,并且写了方法的具体实现后,子类就可以不用强制实现新的方法,它相当于直接继承了接口中的默认实现,当然子类也可以选择自己实现,这个完全没有问题,可以实现兼容
上面的例子,当然也可以通过设计模式来解决,这里仅仅是为了展示default关键字的用法
一个小的知识点,每天进步一点点~~~
如果感觉对你有些帮忙,请收藏好,你的关注和点赞是对我最大的鼓励!
如果想跟我一起学习,坚信技术改变世界,请关注【Java天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您