应该如何跟踪带有继承的Java程序?

问题描述 投票:3回答:2

我正在寻找一种方法来解释如何跟踪以下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()是更奇怪的。

java inheritance override private public
2个回答
0
投票

由于来自processAprivate方法,B完全没有意识到它的存在,它不能被覆盖。

类似地,当你在callProcess的一个实例上调用B时,它会调用A.callProcess(因为它没有在B中被覆盖)。 A只知道它自己的process方法(不能被覆盖)并调用它。

如果您要将process中的A方法的可见性更改为publicprotected,则可以在B中覆盖它,只要签名匹配,即它们必须具有相同的可见性。


-1
投票

是的,对于隐式覆盖,被覆盖的方法不能具有比覆盖方法更严格的访问级别。

© www.soinside.com 2019 - 2024. All rights reserved.