Java方法访问运行时多态性

标签 java oop polymorphism dynamic-dispatch

我有以下java代码。

class A {

        public void method1() {
            System.out.println("A 1");
            method2();
        }

        public void method2() {
            System.out.println("A 2");
        }

    }

    class B extends A {
        @Override
        public void method2() {
            System.out.println("B 2");
        }
    }

    public class Tester {
        public static void main(String[] args) {
            A a = new B();
            a.method1();
        }
    }

打印

    A 1
    B 2
  • 调用 a.method1() 时,运行时到底发生了什么?
  • 如何从父级调用派生方法?
  • 是否查看对象和方法名称字符串并调用 运行时的方法?
  • 它默认调用 this.method2() 吗?

最佳答案

由于方法 method1(...) 从未被重写,因此 B 继承了 A 的 method1() 并且调用它就像在 B 中定义一样。

由于 method1() 调用 method2(),因此在创建实例时,会调用 B 中定义的重写方法 method2() B 构造函数。

如果使用 A 构造函数创建另一个实例,则不会获得 B 中定义的重写的 method2(...),而是获得原始的 method2(...) 在 A 中定义。

关于Java方法访问运行时多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47996412/

相关文章:

java - 本地主机的 Eclipse tomcat https 配置

java - Android SQLITE - 未返回正确的数据?

java - 将 Java Stream 过滤为 1 个且仅 1 个元素

java - 使用 Spring Boot 缓存用户详细信息

c++ - 对于开始游戏开发探索的新手,您推荐哪些游戏创意?

C++ 通过返回类型选择函数

javascript - JS中这两种编码风格有什么区别?

java - OOP (Java) - 生成对象的最佳方式

class - Fortran语言中的多态性

c++ - C++ 中 (base->*&Func)() 的含义是什么