Java类和异常处理

来源:互联网 发布:python rfm模型 编辑:程序博客网 时间:2024/05/17 23:05

实现沙发床类

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 的任何实现,就可以让该类接受 ChinaSocketGermanySocket

instanceof

当我拿到一个对象的引用时,有时需要判断这个引用真正指向的类。我们可以从该类继承树的最底层开始,使用 instanceof 操作符判断,第一个结果为 true 的类即为引用真正指向的类。

  • 需要注意的是,在这里 b 继承于 a ,所以当 new 了一个 b 出来后, b instanceof bb instanceof a 都为true。

异常处理

异常处理是每个语言的重要一环。我们先来看看Java中的异常的层次。

  • 下图中程序抛出了 IOException 异常。其提示为 FileNotFound 。除此之外,访问权限控制、IO流错误等情况都会抛出 IOException 异常。

  • 下图中程序抛出了 RuntimeException 异常。其提示为 ArrayIndexOutOfBoundsException

在finally前return

首先要明确,在 try 块执行了且程序不强制退出的情况下, finally 块一定会被执行。 即使是在 trycatchreturn ,也不影响这个结论。

  • 如下图,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 依然会执行。

过程感言

  • 虽然已经了解到了 finallyreturn 的执行先后关系,但我觉得在实际编程中应该尽量避免出现这种容易让人混淆的情况,了解其工作机制即可。
  • 适配器模式在不改变A的情况下能让B去使用A的特性,这是一个非常棒的特性,因为在实际项目中经常能够碰到这样的情况。
0 0