java - 带有继承的Java程序应该如何追溯?

标签 java inheritance overriding private public

我正在寻找一种方法来解释应该如何跟踪以下 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() 就会被调用。

最佳答案

因为 Aprocess 是一个private 方法,B 完全不知道它的存在,它不能被覆盖。

同样,当您在 B 的实例上调用 callProcess 时,它会调用 A.callProcess(因为它没有在 中被覆盖>B). A 只知道它自己的 process 方法(不能被覆盖)并调用它。

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

关于java - 带有继承的Java程序应该如何追溯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55587870/

相关文章:

ios - 覆盖 iOS 系统音量播放闹钟

基类方法使用的 C# 成员变量覆盖

c++ - 继承和析构函数 - 理论问题 - C++

css - 应用 CSS 格式以仅在 TD 级别覆盖它

java - Resteasy 在没有 web.xml 的情况下配置 JacksonJaxbJsonProvider 提供者

java - 使用命令行创建 Jar 文件时出现问题

具有派生对象函数调用的 C++ 单例对象

c++ - 继承自非专用模板(共享库)

java - 如何在java中按列打印字符串

java - JSP web 应用程序 :javax. servlet.ServletException : java. lang.NoClassDefFoundError: