扫码关注官方订阅号
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
你
throw new Sneeze();
为何不能被?
} catch (Sneeze s) { System.out.println("Caught Sneeze"); return; }
你对Java的类这个概念了解还不够,Sneeze是Annoyance的子类,意味着Sneeze一定是Annoyance,所以参数类型为Annoyance的时候,传递进去一个Sneeze实例并没有什么问题,这个实例在被抛出的时候当然会被捕获。有一段类似的代码你可以看看。
class Animal { void talk(){ System.out.print("I'm Animal"); } } class Human extends Animal { void talk(){ System.out.print("I'm Human"); } } class Main{ public static void main(String[] args) throws Exception { bark(new Human()); } static void bark(Animal a){ a.talk(); } }
在上面的代码中,为什么最后会打印I'm Human而不是I'm Animal
这里没有做任何的类型转换,打印Caught Annoyance之后抛出的仍然是之前的对象,只是由父类型引用了。你描述的情况是下面的情形:
public class Human { public static void main(String[] args) throws Exception { try { try { throw new Sneeze(); } catch (Annoyance a) { System.out.println("Caught Annoyance"); throw new Annoyance(); } } catch (Sneeze s) { System.out.println("Caught Sneeze"); return; } finally { System.out.println("Hello World!"); } } }
这个应该是下转型的问题
题主的问题简化成下面的样子会清晰点
Annoyance a=new Sneeze(); Sneeze s=(Sneeze)a;
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
你
为何不能被?
你对Java的类这个概念了解还不够,Sneeze是Annoyance的子类,意味着Sneeze一定是Annoyance,所以参数类型为Annoyance的时候,传递进去一个Sneeze实例并没有什么问题,这个实例在被抛出的时候当然会被捕获。有一段类似的代码你可以看看。
在上面的代码中,为什么最后会打印I'm Human而不是I'm Animal
这里没有做任何的类型转换,打印Caught Annoyance之后抛出的仍然是之前的对象,只是由父类型引用了。
你描述的情况是下面的情形:
这个应该是下转型的问题
题主的问题简化成下面的样子会清晰点