给定以下代码:
父类(super class):
package poc.poc;
public class SuperClass {
private void method() {
System.out.println("SuperClass!");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SuperClass s = new SubClass();
s.method();
}
}
子类:
package poc.poc;
public class SubClass extends SuperClass {
public void method() {
System.out.println("Subclass!");
}
}
当我运行 SuperClass
的主要方法时,我希望得到某种异常,但实际上运行的是 SuperClass
中的代码,而不是SubClass
中的代码,因此在子类实例上运行父类(super class)类型的实例方法。
为什么会这样? 编辑:这不违反封装吗?
附言当更改为 protected 而不是 private 修饰符时,多态性开始发挥作用,我们又回到了我称之为“预期行为”的状态
最佳答案
无法覆盖私有(private)方法。相反,子类隐藏它。这意味着当以多态方式使用子类时,该方法不被视为父类的现有方法之一。这就像一种全新的方法,无法通过多态性获得。
私有(private)方法不是父类契约的一部分。多态性仅适用于属于父契约一部分的方法。如果不是这样,您可以通过更改作者希望它私有(private)的实现来使类的行为与其契约不同。如果作者希望您这样做,他们会使用 protected
来代替。实际上,private
方法类似于 final
。
在这个特定的 main 方法中,因为它是在实际父类中定义的,所以它能够看到一个私有(private)方法,因此能够调用它。如果您的 main 方法已经在任何其他类中并试图调用它,它将失败。
关于java - 父类(super class)的私有(private)方法在子类引用上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26689833/