java - 为什么子对象调用具有主方法的超类的私有方法?
问题描述
在下面的代码中,子类对象调用了它的 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”)。为什么调用会因为父方法的访问说明符而受到影响?
解决方案
私有方法不能被覆盖;它们是完全不同的项目,例如重新声明(阴影)字段。
当方法的可见性不是私有的时,编译器使用该invokevirtual
指令,该指令负责找到适当的覆盖并执行它。但是,对于私有方法,编译器使用invokespecial
(参见“注释”),它明确地不允许覆盖。
推荐阅读
- r - bookdown:自定义输出文件名
- canvas - 将网络摄像头流作为 WebGL 纹理进行操作?
- python - 使用包含具有特定值的其他列的名称的字符串向数据框添加列
- r - 将字符列转换为保留列标签的因子
- javascript - 如何使用 CSS 或 Javascript 创建一个看起来无限的选取框
- python - str.endswith(suffix[, start, end]) 的机制是什么?
- xml - 如何在 XML 文件中提取 connection.username 并替换
- java - 如何在 Eclipse 中打开和运行 .java 文件?
- javascript - 如何在 chromium 开发者控制台中使用 console.log、console.warn 等?
- r - 在R中找到函数的最大值