当前位置: 首页 > 面试题库 >

Java重载和继承规则

锺离赤岩
2023-03-14
问题内容

我之所以学习,是因为我参加了考试,而大多数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语言规范(参见8.4.9节)规定和描述。

调用方法时(第15.12节),实际参数(和任何显式类型参数)的数量以及参数的编译时类型在编译时用于确定将被调用的方法的签名(
§15.12.2)。如果要调用的方法是html" target="_blank">实例方法,则将在运行时使用动态方法查找(第15.12.4节)确定要调用的实际方法。

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

A.method(AX)

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

AX.method(A)


 类似资料:
  • 问题内容: 这是我遇到的一个测试练习问题,希望您能帮助我理解概念 让Hawk成为Bird的子类。假设某个类有两个重载的方法void foo(Hawk h)和void foo(Bird b)。在声明Bird x = new Hawk()之后,将在调用foo(x)中执行哪个版本; 这是我到目前为止的代码,有人可以向我解释为什么foo(bird b)被执行吗? 问题答案: Java执行重载解析以选择方法

  • 本文向大家介绍Java和多重继承,包括了Java和多重继承的使用技巧和注意事项,需要的朋友参考一下 Java不支持多重继承。这意味着一个类不能扩展一个以上的类。因此,跟随是非法的 但是,一个类可以实现一个或多个接口,这帮助Java摆脱了多重继承的可能性。extend关键字仅使用一次,并且父接口在逗号分隔的列表中声明。例如,如果Hockey接口同时扩展了Sports和Event,它将被声明为- 下面

  • 问题内容: 我正在学习Java。我对继承有疑问。当子类扩展父类并且父类具有引用在父类中声明的实例变量的方法时。但是子类dint覆盖了此方法,并声明了与父类同名的实例变量。在这种情况下,将引用来自child的实例变量或将引用parent的实例变量。下面是代码片段 我得到的输出是 在孩子 10的父母中 有人可以让我理解为什么它引用父类的实例变量而不是子类的实例变量。 另一个疑问是,当父类和子类中有静态

  • 正如节点可以从其他节点继承一样,这可以为相似的节点复制很多代码, 同样的思想也可以用于类。 例如,假设你有一个管理 Apache Web 服务器的 apache 类, 你想要使用略有不同的配置文件设置一台新的 Apache 机器 — 也许是监听的端口不同。 你可以复制整个 apache 类,除了配置文件。另外,你可以从 apache 类中提取配置文件并创建两个新类,每个新类都包含 apache 基

  • 本文向大家介绍java中重载,继承,重写和多态的区别,包括了java中重载,继承,重写和多态的区别的使用技巧和注意事项,需要的朋友参考一下 重载,继承,重写和多态的区别: 1)继承是子类获得父类的成员。 2)重写是继承后重新实现父类的方法。 3)重载是在一个类里一系列参数不同名字相同的方法。 4)多态则是为了避免在父类里大量重载引起代码臃肿且难于维护。 网上看到一个有趣的说法是:继承是子类使用父类

  • 问题内容: 为了完全理解如何解决Java的多重继承问题,我有一个经典的问题需要澄清。 可以说我有类此有子类和我需要做一个类,从扩展和自既是一只鸟和一匹马。 我认为这是经典的钻石问题。从我能理解经典的方式来解决,这是使,和类接口,并实现从他们。 我想知道是否还有另一种方法可以解决仍然可以为鸟和马创建对象的问题。如果有一种能够创造动物的方法,那也很棒,但不是必须的。 问题答案: 你可以为动物类(生物学