- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Kathey Sierra 的 SCJP 书中摘录如下:
<小时/><小时/>If a method is overridden but you use a polymorphic (supertype) reference to refer to the subtype object with the overriding method, the compiler assumes you’re calling the supertype version of the method. If the supertype version declares a checked exception, but the overriding subtype method does not, the compiler still thinks you are calling a method that declares an exception (more in Chapter 5).
Let’s take a look at an example:
class Animal {
public void eat() throws Exception {
// throws an Exception
}
}
class Dog2 extends Animal {
public void eat() { /* no Exceptions */ }
public static void main(String[] args) {
Animal a = new Dog2();
Dog2 d = new Dog2();
d.eat(); // ok
a.eat(); // compiler error -
// unreported exception
}
}This code will not compile because of the Exception declared on the Animal eat() method. This happens even though, at runtime, the eat() method used would be the Dog version, which does not declare the exception.
现在我不明白的是,a.eat();
为什么会引发编译器错误?(即使 Super 存在异常,child 中的重写函数也可能不会出现任何异常)
最佳答案
编译器不知道所引用对象的真实类型。它仅检查分配是否有效。
对 a.eat
的调用会导致编译错误,因为编译器不知道 a 引用的 Animal 是 Dog2。它仅根据引用 Dog2 的变量的类型来决定是否可以抛出已检查的异常。
编译器并不聪明。它不运行代码,也不跟踪分配给变量a
的对象的实际类。
正如当您使用其父类(super class)的类型引用对象时,您不会看到特定于子类的方法一样,您也会看到父类(super class)的 throws 子句,而不是子类方法的 throws 子句。
如果在最后一行向子类添加强制转换:
((Dog2)a).eat();
那么你就不会得到未报告的异常编译错误。
关于java - SCJP - 使用异常处理的重写方法会引发编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40954791/
我之前遇到的关于 SO 的问题已经将近 2 年了。 我刚刚为 SCJP 6 购买了 Kathy Sierra 和 Bert Bates 的书。但它发生了,所以现在在我阅读博客时,我听说 SCJP“PL
嗨,我无法理解为什么输出是 'ex [6, 7, b, d] [6, 7, b]' 这段代码。请有人建议子集如何与 数字和字母?谢谢 import java.util.*; public class
在调试java多线程程序时,我设置了断点。在启动方法调用后,控件将不会运行menthod,您可以让我知道调试过程吗? 示例代码 class Test extends Thread { publ
public class Hotel { private int roomNr; public Hotel(int roomNr) { this.roomNr = ro
下面将因“标签 z 丢失”而编译失败,但如果我只是将 z: 移动到 o = o + 2 之后的下面一步,那么这会起作用吗?这背后的逻辑是什么? public class Breaker { stati
考虑: class Building { Building() { System.out.print("b "); } Building(String name
public class Starter extends Thread{ private int x = 2; public static void main(String[]
给出下面的代码。该代码由“java Test 1 2 3 4”运行。结果是什么? public class Test { public static void main(String args[])
另一个让我困惑的考试问题: public String makinStrings() { String s = “Fred”; s = s + “47”; s = s.substring(2,
我在理解 K&B 的 SCJP 书中《面向对象》一章中的问题 9 时遇到问题。 问题: public class Redwood extends Tree { public static void m
即使得到正确答案,我也无法弄清楚 SCJP 问题: 从以下代码(来源:http://scjptest.com)中,我们需要确定何时引用为 myInt 的对象符合垃圾回收条件: 01.public vo
给定: public class LineUp { public static void main(String[] args) { double d = 12.345;
只是想知道 SUN 是否提供任何可用于 SCJP 的好东西(免费或付费)??我听说微软正在提供这样的好东西。有人对此有任何想法吗? 干杯,对战 最佳答案 你可以把它写在你的简历上。大部分就是这样。 肯
这个问题来自 SCJP 转储。可能看起来很愚蠢,但我对选项有点困惑。请帮帮我 public class Donkey2 { public static void main(String[] ar
public class Person { private String name; public Person(String name) { this.name =
实际上来自SCJP 6 StudyGuide Exam310-065(MGH,2008) alt text http://www.freeimagehosting.net/uploads/1f3746
我无法理解 SCJP 书籍 K&B 第 9 章(线程)中的以下程序 问题: class Dudes{ static long flag = 0; // insert code her
Kathey Sierra 的 SCJP 书中摘录如下: If a method is overridden but you use a polymorphic (supertype) referen
public class Threads2 implements Runnable { public void run() { System.out.println("run.
这个问题是由考试实验室操纵的 public class B{ public static void main(String args[]){ byte g =10;
我是一名优秀的程序员,十分优秀!