我正在浏览Kathe sierra编写的SCJP 6,并遇到了有关以重写方法引发异常的解释。我真的不明白。有人可以向我解释吗?
覆盖方法不得抛出比被覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类。
这意味着,如果某个方法声明抛出一个给定的异常,则子类中的重写方法只能声明抛出该异常或其子类。例如:
class A {
public void foo() throws IOException {..}
}
class B extends A {
@Override
public void foo() throws SocketException {..} // allowed
@Override
public void foo() throws SQLException {..} // NOT allowed
}
SocketException extends IOException
,但SQLException
没有。
这是由于多态性:
A a = new B();
try {
a.foo();
} catch (IOException ex) {
// forced to catch this by the compiler
}
如果B决定抛出SQLException
,则编译器无法强迫你捕获它,因为你是B通过其超类- 引用实例的A。另一方面,的任何子类IOException
将由处理的子句(catch
或throws
)处理IOException
你需要能够按其超类引用对象的规则是Liskov替换原理。
由于未经检查的异常可以抛出到任何地方,因此它们不受此规则的约束。如果需要,可以将未经检查的异常作为文档形式添加到throws子句中,但是编译器不会对此执行任何强制措施。
问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha
问题内容: 因此,这是该书的引文: 覆盖方法不得抛出比被覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类。 现在这是我的问题,如果超类中的方法引发异常,那么重写方法可以根本不引发异常吗? 因为我只是在Ja
问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创
我想在我的android项目中自动转换视图。所以,我想重写 方法 方法但是java编译不允许这样做,但是重写的方法不会与父方法冲突,并且总是返回视图对象或其子对象。我发现了一些信息,java不允许用泛型方法重写非泛型方法,但我找不到解释。 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ8
问题内容: 对于在要克隆对象的类中重写克隆方法,我感到困惑。 对象类具有 受保护的对象 方法,并且按照受保护的行为,即 当方法受到保护时,只能由类本身,该类的子类或与该类位于同一包中的类访问 。 由于Java中的每个类都从Object扩展而来,因此它应该具有clone方法,但仍然被迫重写clone。为什么需要它? 另外,我在某些地方已经阅读了有关覆盖克隆对象并将其公开的信息。我不知道为什么会这样吗
问题内容: 我很困惑为什么不允许以下内容: 我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的? 我希望所有类都可以实现该方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法… **_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。 问题答案: 在Java中调用静态方法要