简单了解Java的默认和静态方法
这篇文章主要介绍了简单了解Java的默认和静态方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
浅谈Java的默认和静态方法
允许在接口中声明默认方法和静态方法,是JDK1.8新增的特性。存在即合理,两者的出现,让接口越来越像抽象类,那么它们为什么出现呢,它们的出现产生了哪些便利,Java小白开始学习并总结,不足之处,还望评论区指点一二!
Java新增默认方法有啥用
官方解答:默认方法允许您添加新的功能到现有库的接口中,并能确保与采用旧版本接口编写的代码的二进制兼容性。
这个光看枯燥的介绍好像很难理解,举个简单的例子。假设有一个很大很大的项目,一个接口被很多很多的类所实现,大家都平安无事平稳地运行着。突然有一天,出现了一个小小地问题,或者说有一个更好的优化方案,需要在这些实现类去增加。在默认方法出现之前,只有抽象方法,且需要在实现类中给出具体定义才能操作,那岂不是只能两眼一闭,直接从早干到晚地添加啦。
但是,默认方法地出现允许在接口中给出方法的具体实现,且实现类中能够自动实现默认方法,我只需要将这个优化放在接口的默认方法里面,就能完成对所有实现类的优化啦。当然,纯属个人理解,如果我的例子有不恰当的地方,欢迎指正哦。
packagecom.my.pac21;
/**
*@autherSummerday
*/
interfaceClosable{
voidclose();
//假设是新增的默认方法
defaultvoidmakeSound(){
System.out.println("peng!");
}
}
interfaceOpenable{
defaultvoidmakeSound(){
System.out.println("peng!");
}
}
classWindowimplementsClosable{
@Override
publicvoidclose(){
System.out.println("Window.close");
}
}
publicclassDoorimplementsClosable,Openable{
@Override
publicvoidclose(){
System.out.println("Door.close");
}
//两个接口中包含同名的方法,需要重写,指定一个
@Override
publicvoidmakeSound(){
System.out.println("needtooverridedefaultmethods");
}
publicstaticvoidmain(String[]args){
Closablecw=newWindow();
Closablecd=newDoor();
cw.close();//Window.close
cd.close();//Door.close
//实现默认方法
cw.makeSound();//peng!
cd.makeSound();//needtooverridedefaultmethods
}
}
Java新增的静态方法有啥用
默认方法和静态方法的在接口的出现让接口失去“全是抽象方法”的特性,在探究完新增的默认方法之后,我们该对静态方法下手啦。开始疯狂查找资料。。。
BeforeJava8madeitpossibletodeclarestaticmethodsininterfaces,itwascommonpracticetoplacethesemethodsincompanionutilityclasses.Forexample,thejava.util.Collectionsclassisacompaniontothejava.util.Collectioninterface,anddeclaresstaticmethodsthatwouldbemoreappropriateintherelevantJavaCollectionsFrameworkinterfaces.Younolongerneedtoprovideyourowncompanionutilityclasses.Instead,youcanplacestaticmethodsintheappropriateinterfaces,whichisagoodhabittocultivate.
这个是我在stackoverflow上找到的答案,什么意思呢,在没有新增静态方法之前,我们如果想让一些固定的操作在接口中出现,就必须定义一个和接口配套的实现类。而接口中静态方法的出现,可以直接通过接口调用静态方法。
packagecom.my.pac21;
/**
*@autherSummerday
*/
publicclassTest{
publicstaticvoidmain(String[]args){
intval1=5;
intval2=6;
//通过创建实现类的对象
Countableb=newCountableCompanion();
System.out.println(b.getNum(val1,val2));
//直接通过接口调用
Countable.getMul(val1,val2);
}
}
interfaceCountable{
//普通抽象方法
intgetNum(inta,intb);
//静态方法
staticintgetMul(inta,intb){
returna*b;
}
}
//实现接口的实现类
classCountableCompanionimplementsCountable{
@Override
publicintgetNum(inta,intb){
returna+b;
}
}
这是一个我自认为还比较幼稚的例子,仅供理解。
普通抽象方法的情况:我在接口中定义了一个抽象方法,而后我又定义了实现该方法的实现类,最后通过创建实现类的实例来调用该方法,最后算得两值之和。可以想象,在实际中,如果相同性质的方法想要在多个实现类中实现,这种做法是比较麻烦的。
静态方法的情况:就很直接地在接口中定义静态方法,且可以被接口直接调用,不需要再定义与其配套的实现类,多舒服哦。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。