方法重写时,为什么访问符越来越宽泛?异常类型要越来越具体?
参考答案
重写是为了使用 父类类型
操作 子类对象
,让类型的操作更通用,更泛化。
访问修饰符为什么要越来越宽泛?
假设现在有父类Animal,子类Cat,思考下面的 反例:
class Animal {
public void eat() {}
}
class Cat extends Animal {
void eat() {}
}
子类Cat允许同包其它类调用eat方法,而父类Animal允许所有类访问eat方法,由多态:
Animal a = new Cat();
a.eat(); // 本来是所有类都能访问,但现在它实际所引用的Cat反而违反了此约定,反证之。
异常类型为什么要越来越具体?
假设现在有父类Animal,子类Cat,思考下面的 反例:
class Animal {
public void eat() throws IOException{}
}
class Cat extends Animal {
public void eat() throws Exception{}
}
现在使用多态,代码为:
Animal a = new Cat();
a.eat(); // 本来只会抛出IOException,但实际引用的是子类Cat,有可能抛出NullPointerException,与声明不符,反证之。