简单了解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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。