Java重载和继承规则

2024-03-25

我一直在学习,因为我有考试,而且我对 Java 的大部分内容都没有太多问题,但我偶然发现了一条我无法解释的规则。这是一个代码片段:

public class A {

    public int method(Object o) {
        return 1;
    }

    public int method(A a) {
        return 2;
    }
}

public class AX extends A {

    public int method(A a) {
        return 3;
    }

    public int method(AX ax) {
        return 4;
    }
}

public static void main(String[] args) {
    Object o = new A();
    A a1 = new A();
    A a2 = new AX();
    AX ax = new AX();

    System.out.println(a1.method(o));
    System.out.println(a2.method(a1));
    System.out.println(a2.method(o));
    System.out.println(a2.method(ax));
}

这将返回:

1 3 1 3

虽然我希望它会回来:

1 3 1 4

为什么a2的类型决定了AX中调用哪个方法?

我一直在阅读有关重载规则和继承的内容,但这似乎很晦涩,我无法找到确切的规则。任何帮助将不胜感激。


这些方法调用的行为由Java语言规范 https://docs.oracle.com/javase/specs/jls/se10/html/jls-8.html#jls-8.4.9(参考第 8.4.9 节)。

当调用方法时(第 15.12 节),实际参数的数量(以及 任何显式类型参数)和编译时类型 在编译时,使用参数来确定签名 将被调用的方法(第 15.12.2 节)。如果该方法是 invoked 是一个实例方法,实际被调用的方法是 使用动态方法查找(第 15.12.4 节)在运行时确定。

在您的示例中,Java 编译器确定与您调用方法的实例的编译类型最接近的匹配。在这种情况下:

A.method(AX)

最接近的方法来自类型 A,带有签名A.method(A)。在运行时,动态调度在actualA 的类型(它是 AX 的实例),因此这是实际调用的方法:

AX.method(A)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java重载和继承规则 的相关文章

随机推荐