这段时间看了看 《on java 8》 (即 《think in java》
的第五版),书确实是好书,不少地方都豁然开朗,比如多态、接口等等,以前只是知道有这个东西,知道他的语法,但对于他的好处却是懵懵懂懂,只想着自己的境界还不够,还体会不到这些设计的真正强大之处。
接口的基础语法也就不再多说了,就写写我的新收获。
以前老师说过,接口是一种规范,在以前我以为的所谓规范仅仅是:
决定方法名、参数列表和返回类型
想来是有一定作用,但又感觉不到具体强大的地方,只能归咎于自己境界还不够,还无法体会这种语法的强大。
在 《on java 8》
中,作者给出了接口的具体优点:
一个接口表示:所有实现了该接口的类看起来都像这样。因此,任何使用某特定接口的代码都知道可以调用该接口的哪些方法,而且仅需知道这些。所以,接口被用来建立类之间的协议。当方法操纵的是一个类而非接口时,它就只能作用于那个类或其子类。如果想把方法应用于那个继承层级结构之外的类,就会触霉头。接口在很大程度上放宽了这个限制,因而使用接口可以编写复用性更好的代码。
是不是还是感觉看的云里雾里,别着急,我们用一个例子来感受一下
public class Main { public static void main(String[] args) { // 使用测试类1调用test() Test1 test1 = new Test1(); test(test1); // 使用测试类2调用test() Test2 test2 = new Test2(); test(test2); } public static void test(TestInterface testInterface) { System.out.println("________________________"); System.out.println("this is a testInterface"); testInterface.sayTest(); System.out.println("________________________"); } } // 接口 public interface TestInterface { void sayTest(); } // 测试类1 public class Test1 implements TestInterface{ @Override public void sayTest() { System.out.println("this is test2"); } } // 测试类2 public class Test2 implements TestInterface { @Override public void sayTest() { System.out.println("this is test2"); } }
结果如下
通过多态与向上转型,Test1和Test2共用了一个方法
接口提供了一种更高层次的抽象,让test()这个方法更加通用,诚然,我们也可以通过继承来实现该功能,但java只能单继承而已。
在一前接口中只能单纯的定义方法,而Java 8 为关键字 default 增加了一个新的用途,当在接口中使用它时,任何实现接口却没有定义方法的时候可以使用 default 创建的方法体。
// 这是一个能正常运行的接口 interface InterfaceWithDefault { void firstMethod(); void secondMethod(); default void newMethod() { System.out.println("newMethod"); } }
关于为什么需要默认方法,书中给出的解释是:
增加默认方法的极具说服力的理由是它允许在不破坏已使用接口的代码的情况下,在接口中增加新的方法。默认方法有时也被称为 守卫方法 或 虚拟扩展方法 。
以上两点是我的收获当中感触较大的地方,当然,书中的知识点还有很多,就算上面两点,也只是浅尝辄止,该书在gitbook上已经有了翻译版,感觉翻译的质量还是很高的,有兴趣的可以 看看 ,若是对自己的英语和技术水平有信心,甚至可以参与翻译。