给出以下代码:
SuperClass:
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
的main方法时,我希望得到某种异常,但实际上运行SuperClass
中的代码,而不是{{1}中的代码因此,在子类实例上运行超类类型的实例方法。
为什么会这样? 编辑:这不违反封装吗?
P.S。当更改为protected而不是private修饰符时,多态性开始启动,我们又回到了我称之为“预期行为”的东西
答案 0 :(得分:4)
无法覆盖私有方法。相反,子类隐藏它。这意味着当子类以多态方式使用时,该方法不被视为父方法的现有方法之一。这就像是一种无法通过多态性获得的全新方法。
私有方法不是父类合同的一部分。多态性仅适用于作为父母合同一部分的方法。如果它不是那样的话,你可以通过改变作者希望它是私有的实现来使一个类的行为与其合同不同。如果作者希望您这样做,他们会使用protected
代替。实际上,private
方法与final
类似。
在这个特定的main方法中,因为它是在实际的父类中定义的,所以它能够看到私有方法,因此能够调用它。如果你的main方法已经在任何其他类中并试图调用它,那么它将失败。
答案 1 :(得分:3)
私有方法无法覆盖,仅此解释了您在此处看到的内容。您可以在main中调用该方法,因为main位于同一个类中,否则就不可能。
您正确分析了将private
更改为protected
时所发生的情况:该方法现在已经可以覆盖,并且"最近的"在子类实例上调用它时执行它的定义。