方法重写时,为什么访问符越来越宽泛?异常类型要越来越具体?

参考答案

重写是为了使用 父类类型 操作 子类对象,让类型的操作更通用,更泛化。

访问修饰符为什么要越来越宽泛?

假设现在有父类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,与声明不符,反证之。

results matching ""

    No results matching ""