为什么子对象调用具有 main 方法的 super class 的私有方法?
Why does a child object call private method of the super class having main method?
在下面的代码中,子对象 class 调用了它的 getBankName() 方法,但是调用了父对象 class 的私有方法 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
instruction, which is responsible for finding the appropriate override and executing it. However, for a private method, the compiler uses invokespecial
(参见 "Notes"),它明确不允许覆盖。
在下面的代码中,子对象 class 调用了它的 getBankName() 方法,但是调用了父对象 class 的私有方法 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
instruction, which is responsible for finding the appropriate override and executing it. However, for a private method, the compiler uses invokespecial
(参见 "Notes"),它明确不允许覆盖。