Java的重载和继承规则Java的重载和继承规则(Java overloading and inhe

2019-06-02 13:05发布

我一直在学习,因为我有一个考试,我没有和大多数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?

我一直在阅读上的重载规则和继承,但是这似乎不够,我一直没能找到确切的规则模糊。 任何帮助将不胜感激。

Answer 1:

这些方法调用的行为决定,并且通过所描述的Java语言规范 (参考节8.4.9)。

当一个方法被调用(§15.12),实际参数(和任何明确的类型参数)和编译时间类型的参数的数量被使用,在编译时,确定将被调用的方法的签名( §15.12.2)。 如果这是要被调用的方法是一个实例方法,将在运行时确定要调用的实际方法,使用动态方法查找(§15.12.4)。

在你的榜样,Java编译器决定了编译类型你是在调用你的方法实例的最接近的匹配。 在这种情况下:

A.method(AX)

最接近的方法是从A型,与签名A.method(A) 在运行时,动态调度上的实际类型A(其是AX的一个实例)的执行,并且因此这是实际调用的方法:

AX.method(A)


Answer 2:

我会以更简单的方式澄清它。 当你喜欢这里你没有让子类对象超类引用见。

始终有一件事记住的一点是,当你用超类引用调用,没有对象的问题是子类将进入超类的,适当的签名一起使用该名称检查方法是有或没有。

现在,如果它会发现它比它会检查它是否被覆盖? 如果是比它会去到子类方法就像在这里它去。 另一个明智它将执行相同的父类的方法。

我可以给你它的例子...只是隐藏

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

方法:检查你的答案,你会得到1 2 1 2,为什么?因为它的第一顺位参考。 因为你重写它与比调用它,所以它给3 .. !! 希望它的大,但很容易理解。 快乐学习



Answer 3:

A2为A和JVM引用使用参考第一(不作为你预期acutal对象)。



文章来源: Java overloading and inheritance rules