我正在寻找一种方法来解释如何跟踪以下Java程序(调用哪个方法等),尤其是访问修饰符和继承如何影响方法调用。
我有两个类A和B,其中B扩展A.类A有私有方法process()
类B有公共方法process()
类A有公共方法callProcess()
,它调用process()
。在主程序中,我创建了一个对象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类,但是发生的是来自A的process()
被调用。如果我将A中的process()
的修饰符更改为public,则调用B中的process()
是更奇怪的。
由于来自process
的A
是private
方法,B
完全没有意识到它的存在,它不能被覆盖。
类似地,当你在callProcess
的一个实例上调用B
时,它会调用A.callProcess
(因为它没有在B
中被覆盖)。 A
只知道它自己的process
方法(不能被覆盖)并调用它。
如果您要将process
中的A
方法的可见性更改为public
或protected
,则可以在B
中覆盖它,只要签名匹配,即它们必须具有相同的可见性。
是的,对于隐式覆盖,被覆盖的方法不能具有比覆盖方法更严格的访问级别。