如果我有一个具有以下功能的抽象类-
abstract class A{
void foo(String s) throws Exception{
throw new Exception("exception!");
}
}
然后是另一个扩展抽象类并实现自己的foo版本的类:
class B extends A{
void foo(String s){
//do stuff that does *not* throw an exception
}
}
这会带来问题吗?具体在以下测试案例中-
Collection<A> col = new Collection<A>();
B b = new B();
col.add(b);
for(A a : col){
a.foo();
}
我进行了一些测试,但似乎没有任何问题,但是我不明白为什么调用了B的foo而没有调用A的原因
最佳答案
由于Polymorphism
。
由于在运行时Collection
中的实际对象类型为B
,因此调用了B.foo()
。
基本上,如果您有一个分配给超类引用的子类型对象,则运行时多态性可确保实例方法的子类型版本被调用,即是否已被覆盖。如果不是,则该呼叫退回到超类版本。
什么才算是有效的方法替代?
覆盖的方法必须具有
相同方法签名
协变返回类型(可以返回子类型)
一定不要抛出更广泛的检查异常(适用于您的问题和@ Dgrin91的注释,即仅因为重写的方法冒了某些风险(引发异常)并不意味着重写的方法应该做同样的事情;因此,它可能不会在抛出异常时所有)
不得使用限制较少的访问修饰符(可以将其设置为公开但非私有)