首页 > 解决方案 > 为什么子对象调用具有主方法的超类的私有方法?

问题描述

在下面的代码中,子类对象调用了它的 getBankName() 方法,而是调用了父类的私有方法 getBankName()。

public class Bank {
    private void getBankName() {
        System.out.println("Bank");
    }
    public static void main(String[] args) {
        Bank bank = new MyBank();
        bank.getBankName();
    }
}

class MyBank extends Bank {
    public void getBankName() {
        System.out.println("MyBank");
    }
}

此外,如果我将父方法的访问说明符更改为public,那么它可以正常工作(子对象调用它自己的方法并打印“MyBank”)。为什么调用会因为父方法的访问说明符而受到影响?

标签: javainheritancesupersuperclassaccess-specifier

解决方案


私有方法不能被覆盖;它们是完全不同的项目,例如重新声明(阴影)字段。

当方法的可见性不是私有的时,编译器使用该invokevirtual指令,该指令负责找到适当的覆盖并执行它。但是,对于私有方法,编译器使用invokespecial(参见“注释”),它明确地不允许覆盖。


推荐阅读