实现沙发床类
Java为了降低难度,并不支持对类的多重继承。但是如果有多重继承的需求,我们也可以用接口(interface)实现多重继承。
- 如下图代码。沙发床继分别继承于沙发,床。
- 而沙发床具有沙发和床的双重特性。
适配器模式
参考博客:一个示例让你明白适配器模式
德国有德国的接口和插座:
interface GermanyInterface { void accept(); } class GermanySocket implements GermanyInterface { public void accept() { System.out.println("德国插座,接受两圆口插口"); } }
德国旅馆采用的是德国标准的接口:
class GermanyHotel { private GermanyInterface s; public GermanyHotel(GermanyInterface socket) { this.s = socket; } public void charge() { this.s.accept(); } }
中国有中国的接口和插座:
interface ChinaInterface { void accept(); } class ChinaSocket implements ChinaInterface { public void accept() { System.out.println("中国插座,接受三扁口插口"); } }
如果在想要在德国旅游时在德国的旅馆里插上中国的插座,就需要一个适配器:
class Adapter implements GermanyInterface { private ChinaInterface cnInterface; public Adapter(ChinaInterface cnInterface) { this.cnInterface = cnInterface; } public void accept() { this.cnInterface.accept(); } }
有了这个适配器就可以有如下的效果,我并没有改变
GermanyHotel
的任何实现,就可以让该类接受ChinaSocket
和GermanySocket
。
instanceof
当我拿到一个对象的引用时,有时需要判断这个引用真正指向的类。我们可以从该类继承树的最底层开始,使用
instanceof
操作符判断,第一个结果为true
的类即为引用真正指向的类。
- 需要注意的是,在这里
b
继承于a
,所以当new
了一个b
出来后,b instanceof b
和b instanceof a
都为true。
异常处理
异常处理是每个语言的重要一环。我们先来看看Java中的异常的层次。
下图中程序抛出了
IOException
异常。其提示为FileNotFound
。除此之外,访问权限控制、IO流错误等情况都会抛出IOException
异常。
下图中程序抛出了
RuntimeException
异常。其提示为ArrayIndexOutOfBoundsException
。
在finally前return
首先要明确,在
try
块执行了且程序不强制退出的情况下,finally
块一定会被执行。 即使是在try
或catch
中return
,也不影响这个结论。
- 如下图,Intellij IDEA给出的提示和
main
的输出表明finally
中的temp = 20;
这条语句似乎没有被执行,执行的只是try
中的return temp;
。上面的结论被推翻了? - 在断点和输出的帮助下,我们会发现,
finally
块是被执行了的(局部变量temp的值确实发生了改变),而try
块中的return temp;
被执行了两次。现在清楚了,finally语句是在try的return语句执行之后,return返回之前执行。
- 在
try
块的return temp;
语句执行完之后,局部变量temp
的值已经被拷贝到了一个副本等待返回到main
函数;但程序又转过头来执行finally
块的代码(这里的temp = 20;
已经毫无意义,所以被IDEA识别为无效代码)。执行完finally
块,fun()
才真正结束,先前temp
的副本就被返回到主函数。
多重嵌套下的final
在多重嵌套下,如果子
try...catch...finally
结构中的catch
中有返回,那么子结构中的finally
还会执行吗?
- 依照上一问题的结论,可以肯定子结构中的
finally
依然会执行。
过程感言
- 虽然已经了解到了
finally
和return
的执行先后关系,但我觉得在实际编程中应该尽量避免出现这种容易让人混淆的情况,了解其工作机制即可。 - 适配器模式在不改变A的情况下能让B去使用A的特性,这是一个非常棒的特性,因为在实际项目中经常能够碰到这样的情况。