超类的私有方法在子类引用上执行

时间:2014-11-01 13:35:06

标签: java oop inheritance static

给出以下代码:

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修饰符时,多态性开始启动,我们又回到了我称之为“预期行为”的东西

2 个答案:

答案 0 :(得分:4)

无法覆盖私有方法。相反,子类隐藏它。这意味着当子类以多态方式使用时,该方法不被视为父方法的现有方法之一。这就像是一种无法通过多态性获得的全新方法。

私有方法不是父类合同的一部分。多态性仅适用于作为父母合同一部分的方法。如果它不是那样的话,你可以通过改变作者希望它是私有的实现来使一个类的行为与其合同不同。如果作者希望您这样做,他们会使用protected代替。实际上,private方法与final类似。

在这个特定的main方法中,因为它是在实际的父类中定义的,所以它能够看到私有方法,因此能够调用它。如果你的main方法已经在任何其他类中并试图调用它,那么它将失败。

答案 1 :(得分:3)

私有方法无法覆盖,仅此解释了您在此处看到的内容。您可以在main中调用该方法,因为main位于同一个类中,否则就不可能。

您正确分析了将private更改为protected时所发生的情况:该方法现在已经可以覆盖,并且"最近的"在子类实例上调用它时执行它的定义。