如果我有一个具有以下功能的抽象类-

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的注释,即仅因为重写的方法冒了某些风险(引发异常)并不意味着重写的方法应该做同样的事情;因此,它可能不会在抛出异常时所有)
不得使用限制较少的访问修饰符(可以将其设置为公开但非私有)

07-28 03:40