我正在寻找一种方法来解释应该如何跟踪以下 Java 程序(调用了哪个方法等),尤其是访问修饰符和继承如何影响方法调用。
我有两个类 A 和 B,其中 B 扩展了 A。
A 类有私有(private)方法 process()
B类有公共(public)方法process()
A 类具有调用 process()
的公共(public)方法 callProcess()
。
在主程序中,我创建了一个对象 B 并调用方法 callProcess()
。
class A {
private void process(){
System.out.println("Process A.");
}
public void callProcess(){
process();
}
}
class B extends A {
public void process(){
System.out.println("Process B.");
}
}
class MethodTest{
public static void main(String[] args){
B b1 = new B();
b1.callProcess();
}
}
我希望调用 B 的 process()
因为调用 process()
的对象是 B 类型的,但是发生的是 process( )
来自 A 被调用。
更奇怪的是,如果我将 A 中的 process()
修饰符更改为 public,那么 B 中的 process()
就会被调用。
最佳答案
因为 A
的 process
是一个private
方法,B
完全不知道它的存在,它不能被覆盖。
同样,当您在 B
的实例上调用 callProcess
时,它会调用 A.callProcess
(因为它没有在 中被覆盖>B
). A
只知道它自己的 process
方法(不能被覆盖)并调用它。
如果您要将 A
中的 process
方法的可见性更改为 public
或 protected
, 然后它可以在 B
中被覆盖,只要签名匹配,即它们必须具有相同的可见性。
关于java - 带有继承的Java程序应该如何追溯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55587870/