【发布时间】:2019-08-30 10:55:45
【问题描述】:
我正在寻找一种方法来解释应如何跟踪以下 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() 就会被调用。
【问题讨论】:
-
您正在创建 B 类的对象,并调用 A 类上的公共函数 b1.callProcess()。调用被执行并调用 A 类中的 process() 方法,如那是带有签名的私有函数,因此不会被扩展类 B 覆盖。当您更改类 A 中方法 process() 的修饰符时,它与类 B 中方法 process() 的签名完全匹配,继承的类方法将优先,因此当你再次调用时,方法 b1.callProcess() ,类 B 中的 process() 方法被执行。
标签: java inheritance overriding private public