问题 1:多态性受限
如果子类将父类的 public
方法重写为 private
,那么虽然父类方法在父类对象中是 public
的,但对于父类的引用指向子类的对象时,由于子类的重写方法是 private
,就会无法通过父类的引用调用子类的重写方法,因为 private
方法只能在子类内部访问,而不能被外部访问。
问题 2:接口契约破坏
在继承的关系中,父类和子类之间是有一个接口契约的。父类的方法公开(public
)是对外提供的接口,子类重写父类方法时,应该保持这个接口的可用性。如果子类将父类的 public
方法重写为 private
,就会导致外部代码无法通过父类的 public
方法调用子类的实现,这破坏了接口的可用性和一致性。
例子:
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
private void makeSound() { // 编译错误: The method makeSound() from the type Dog must override a superclass method
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.makeSound(); // 这里将尝试调用 Dog 类中的 makeSound 方法
}
}
如果我们通过 Animal
类型的引用来指向 Dog
对象,并尝试调用 makeSound()
方法,将无法访问 Dog
类中的方法。