访问控制权限的变化规则

在继承时,子类可以通过 重写(override) 来改变父类中方法的行为。但是,子类重写方法的访问权限不能比父类的更加严格。这是为了确保符合面向对象的“里氏替换原则”(Liskov Substitution Principle),即子类对象应该能够替换父类对象,而不影响程序的正确性。

规则

  • 子类重写方法的访问权限 可以扩大,但不能 缩小
  • 具体来说:
    • private 方法不能被子类重写,因为它对子类不可见。
    • default 方法可以被子类重写,且访问权限可以提升到 protectedpublic,但不能降低到 private
    • protected 方法可以被子类重写,且访问权限可以提升到 public,但不能降到 defaultprivate
    • public 方法必须保持 public 访问权限。

为什么访问权限有这些变化规则?

这些规则的设计符合以下编程原则:

  1. 封装性

    • privatedefault 访问级别是为了保护类的封装性,确保类的实现细节不暴露给不相关的类或外部世界。这使得类的实现可以在不影响外部代码的情况下发生变化。
  2. 继承中的一致性

    • 通过允许子类扩大访问权限,子类可以增加它的灵活性和可访问性。
    • 但不允许缩小访问权限是为了确保子类对象能够无缝替代父类对象。例如,如果父类的某个方法是 public 的,外部代码可能依赖于访问该方法。如果子类将它的访问权限缩小,那么外部代码就会出错。
  3. 安全性和可维护性

    • 限制某些成员的访问权限可以确保子类不会错误地依赖于父类的内部实现细节。这有助于保持代码的安全性和可维护性,使父类的实现能够灵活修改,而不会破坏子类的行为。