public class A {
public float foo(float a, float b) throws IOException {
}
}
public class B extends A {
......
}
哪些函数可以放在B类中,为什么?
float foo(float a, float b){...}
public int foo (int a, int b) throws Exception {...}
public float foo(float a, float b) throws Exception {...}
public float foo(float p, float q) {...}
我的看法:1.错误,不是从公共开始2.正确,重载3.错误,重写不能引发更广泛的异常4.错误,重写不能引发更广泛的异常
您到底要问什么? 顺便说一句,选择2也是错误的,因为您不能通过更改函数的返回类型来重载它。
@ PiXel1225:您不能仅通过更改其返回类型来重载该方法。 您也可以更改返回类型和参数类型。
@ PiXel1225:2是正确的,看输入类型
4也是错误的,因为声明的异常不同。
您是对的,错过了参数。
@ f1sh:也许4是正确的,没有异常抛出的事实可能没问题吗?
控制重写中允许或不允许的操作的一般原则是,您不能破坏Java在声明的类型为超类型的上下文中使用子类实例的能力。
float foo(float a, float b){...}
错误的,因为您不能降低方法在子类中的可见性。 (如果允许,如果在a上调用foo的人声明为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) {...}
正确。覆盖方法可以忽略在覆盖方法中引发的引发的异常声明。 (如果子类方法不能抛出异常,并且超类方法可以抛出异常,则它不会违反检查的异常规则。)
非常感谢你!!
关于" float foo(float a,float b){...}",为什么说可见度降低了? 默认情况下它不是公开的吗(如果什么都没写?)?
否。默认可见性是"包私有",比public更具限制性。
@斯蒂芬·C,再次打败你!!"包私有"与它所属的类无关吗?
尽管(显然)在超类对子类不可见的上下文中创建子类是不合法的,但是方法重写规则与类访问无关。