JDK8中抽象类和接口

已有 8571人阅读此文 - - JAVA

   Stephen Colebourne说“我认为在java8最大的改变不是lambda表达式,而是在接口中可以使用静态和默认构造方法。”,他补充说“可以使用默认构造方法减少了使用抽象类的理由”。读到这里,我意识到Colebourne在大多数情况下是正确的,我当前所使用的抽象类很多都能通过使用java8的默认方法来替换成接口。在java世界中接口与抽象类的差异一直困扰着开发人员重要问题之一,在许多情况下,在java8中区分接口与抽象类的差异将更加的困难。

   在论坛及博客中有大量的例子在讨论java接口和抽象类的不同。这些包括但不仅限javaWorld”抽象类VS接口”, StackOverflow的“什么时候应该使用接口代替抽象类?”、“接口与抽象类之前的异同”。这些信息都是很有用的,但这些对刚开始使用java8的开发人员来说可能会有一些过时或部分误导。

   当我想了解在java8中关于接口和抽象类的其它不同点时,我决定去看一下java官方教程是怎么说的。在这个教程中已经为java8抽象方法和抽象类更新了一节:“抽象类与接口的对比”,这个章节纳入了JAVA8的内容,并指出了在java8中接口与抽象类的异同。最突出的不同的点是成员和方法的可访问性:抽象类允许非抽象和非final的属性,允许方法是public,privateprotected的。而接口的属性本质上就是publicstaticfinal的,而且所有方法都是public的。

   Java教程罗列出什么时候应该考虑使用抽象类,什么时候应该考虑使用接口。意料之中的,这些不同都是上面的提到的。如果你关心属性或方法是否是private,protected,non-static,或非final,那么考虑使用抽象类,否则你关心的焦点是多继承的类型而不是实现,那么请考虑使用接口。

   因为java中允许一个类可以实现多个接口,但只能继承一个类,接口可以被用于多个不同的类去关联实现(多实现)。要感谢JDK8中提供的默认方法,这个特性可以给多个实现的类提供默认的行为方法。

   这个时候自然会有一个问题:“怎么处理在实现多个接口时,出现两个接口定义了两个相同的默认方法呢?”,答案很简单,这是一个错误的定义^^。如果你不是使用记事本来编写代码的话(这个是大神,膜拜),编译器如netbean8,IDEAeclipse都会在出现两个接口定义相同的默认方法时提示一个错误。


 12.png

 

   如上图,将会现实一个编译错误“class … inherits unrelated defaults for … from types … and …”。

总结

   JDK8带来的最大优势就是接口抽象化,未来将会使原来使用抽象类的实现被使用接口实现来替代。

 

英文原文地址


来源:自成e家 出处:JDK8中抽象类和接口
本文由 自成e家 翻译 ,转载请注明出处,你的支持是我继续写作、分享的最大动力!
期待你一针见血的评论,Come on!