在Java中重写私有方法是无效的,因为父类的私有方法是“自动最终的,并且对派生类是隐藏的”。我的问题主要是学术上的。
不允许父级的私有方法被“重写”(即,在子类中以相同的签名独立实现),这是否违反封装规范?根据封装的原理,子类不能访问或继承父级的私有方法。它是隐藏的。
那么,为什么应该限制子类实现自己的具有相同名称/签名的方法呢?这是否有一个良好的理论基础,还是仅仅是某种务实的解决方案?其他语言(C ++或C#)对此有不同的规定吗?
你不能覆盖私有方法,但可以毫无问题地在派生类中引入一个私有方法。这样可以编译:
class Base { private void foo() { } } class Child extends Base { private void foo() { } }
请注意,如果你尝试将@Override注释应用于该对象,Child.foo()则会出现编译时错误。只要你有你的编译器/ IDE设置,给你警告或错误,如果你缺少一个@Override注释,都应该很好。诚然,我更喜欢将C#方法override用作关键字,但是用Java显然已经太晚了。
@Override
Child.foo()
override
至于C#对“覆盖”私有方法的处理-私有方法最初不能是虚拟的,但是你当然可以在基类中引入一个与私有方法同名的新私有方法。