java - 父类(super class)的私有(private)方法在子类引用上执行

标签 java oop inheritance static

给定以下代码:

父类(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/

相关文章:

c++ - 如何处理状态转换并将 "if"语句替换为多态类型?

swift - Swift 中的父类(super class)与协议(protocol)?

c# - 如何在 .NET 的基类静态方法中获取类类型?

javascript - JavaScript 中的继承

java - 如何绕过 "-XX:+DisableAttachMechanism"Java VM 选项?

java - 从图库中选择图像到 ImageView 后进行图像压缩

python - 在 python 中从 __new__() 调用其他类方法

c++ - 如何选择调用的重载函数

java - 无法访问 TransactionManager 或 UserTransaction 来进行物理事务委托(delegate)

java - 使用适用于 Android 的 Quizlet API