Java重载抛出异常_关于Java:抛出异常的重载和覆盖

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,再次打败你!!"包私有"与它所属的类无关吗?

尽管(显然)在超类对子类不可见的上下文中创建子类是不合法的,但是方法重写规则与类访问无关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值