2
哪些功能可以放在B类中,为什么?
- float foo(float a,float b){...}
- public int foo(int a,int b)抛出异常{...}
- public float foo(float a,float b)抛出Exception {...}
- public float foo(float p,float q){...}
醇>
我的意见:1。错误,不启动公开2.正确,重载3.错误,重写不能抛出更广泛的异常4.错误,压倒不能抛出更广泛的异常
答案 0 :(得分:0)
管理覆盖中允许或不允许的内容的一般原则是,您无法破坏Java在声明类型为超类型的上下文中使用子类实例的能力。
float foo(float a, float b){...}
不正确,因为您无法降低子类中方法的可见性。 (如果允许,如果有人在foo
上调用a
声明为A a = new B();
,那么在运行时会发生什么?)
public int foo (int a, int b) throws Exception {...}
正确。
如果这是覆盖,那么它将是不正确的,因为您无法使用不兼容的返回类型。 (你可以更改返回类型,但覆盖中的返回类型必须是被覆盖的返回类型的子类型)
但是,由于参数类型不同,这是一个重载,而不是覆盖...而且它是正确的!
public float foo (float a, float) throws Exception {...}
不正确,因为您无法抛出更广泛的(已检查)异常。您可以更改例外,但它们必须是子类中的子类型例外。 (关键是不能允许子类方法抛出超类方法签名所说的不能抛出的已检查异常。)
public float foo(float p, float q) {...}
正确。覆盖方法可以省略在重写方法中抛出的抛出异常声明。 (如果子类方法不能抛出超类方法可能会抛出异常,那么它不会破坏已检查的异常规则。)