重载和覆盖抛出异常

overload and override which throws exception

   public class A {
        public float foo(float a, float b) throws IOException {
  }
}
    public class B extends A  {
           ......
    }

哪些功能可以放在B中class,为什么?

  1. float foo(float a, float b){...}
  2. public int foo (int a, int b) throws Exception {...}
  3. public float foo(float a, float b) throws Exception {...}
  4. public float foo(float p, float q) {...}

我的看法:1. 错误,不是以 public 开头 2. 正确,重载 3. 错误,覆盖不能抛出更广泛的异常 4. 错误,覆盖不能抛出更广泛的异常

管理覆盖中允许或不允许的内容的一般原则是,您不能破坏 Java 在声明的类型是超类型的上下文中使用子类实例的能力。

 float foo(float a, float b){...}

不正确,因为您不能减少方法在子类中的可见性。 (如果允许,如果有人在声明为 A a = new B();a 上调用 foo 会在运行时发生什么?)

 public int foo (int a, int b) throws Exception {...}

正确。

如果这是覆盖,那将是不正确的,因为您不能使用不兼容的 return 类型。 (您可以更改return类型,但覆盖中的return类型必须是覆盖中return类型的子类型)

但是,由于参数类型不同,这是一个重载,而不是覆盖...而且它是正确的!

 public float foo (float a, float) throws Exception {...}

不正确,因为您不能抛出更广泛的(已检查)异常。您可以 更改 异常,但它们必须是子类中的子类型异常。 (重点是不能允许子类方法抛出超类方法签名说不能抛出的已检查异常。)

public float foo(float p, float q) {...}

正确。覆盖方法可以省略在覆盖方法中抛出的抛出异常声明。 (如果子类方法 不能 抛出父类方法可以抛出的异常,它不会破坏已检查的异常规则。)