java - 为什么在方法重写时要引用类型?

标签 java exception overriding

我了解到,在方法重写的情况下,会检查对象而不是类型

class SuperException extends Exception {}
class SubException extends SuperException {}

class AnotherException extends Exception {}
class YetAnotherException extends Exception {}

class A {
  void play() throws SuperException, AnotherException {}
}
class Reduced extends A {
  void play() throws SuperException {} 
}
class Eliminated extends A {
  void play() {} 
}
class Narrower extends A {
  void play() throws SubException {}
}
class TestPolymorphism {
  public static void main(String[] args) {
    A obj = new Eliminated();
    obj.play();                         // Doubt 1
    Eliminated eobj = new Eliminated(); // Doubt 2
  }
}

疑点1:为什么play()是从A类引用的?

疑点2:为什么编译出错?

最佳答案

  1. obj 是继承自 A 的 Elimination 类型,因此可以由 A 类型的变量引用。

  2. 编译错误在 obj.play() 中,因为你没有捕获它抛出的异常。由于 obj 被声明为 A 类型,编译器希望您处理它可能抛出的 2 种类型的异常。它不知道实际上这些异常永远不会被抛出。如果您将 obj 声明为 Elimination,那么错误就会消失。

关于java - 为什么在方法重写时要引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15599192/

相关文章:

ios - 覆盖协议(protocol)扩展默认实现

java - 在 tabFragment View 中实现搜索栏

php - 拉维尔 5.1 : Class html does not exist

java - 是否可以捕获除运行时异常之外的所有异常?

android - 没有这样的服务 ComponentInfo Android JobScheduler

orchardcms - 覆盖 Orchard View 模板

java - 使用简单适配器将 RatingBar 添加到 ListAdapter 无法正常工作

java - 如何使用 Maven 一步构建多个项目

java - 找不到适合 jdbc :derby:<db-name> error on JDBC with Java DB on Linux/Ubuntu 的驱动程序

android - 在 Android 中覆盖 ArrayAdapter