1

在以下程序中:

public class PolyEx1 {
    public static void main(String[] args) {
    A refA = new A();
        refA.method1(null);
    }
}

class A {
    public void method1(Object o) {
        System.out.println("o");
    }

    public void method1(String str) {
        System.out.println("str");
    }
}

输出是“str”,有人能解释一下为什么打印 str 吗?我无法理解这一点。

4

3 回答 3

2

正如 Rohit在这里所解释的,

那是因为 String 类从 Object 扩展而来,因此更特定于 Object。因此,编译器决定调用该方法。请记住,编译器总是选择最具体的方法来调用。

如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。Java 编程语言使用选择最具体方法的规则。

非正式的直觉是,如果第一个方法处理的任何调用可以传递给另一个方法而不会出现编译时类型错误,那么一个方法比另一个方法更具体。

但是,如果您有两个带参数的方法 - String 和 Integer,那么您会得到 null 的歧义错误,因为编译器无法确定哪一个更具体,因为它们是非协变类型。

如JLS的第15.12.5节所述

于 2013-10-18T15:09:48.920 回答
1

Java 尝试使用最具体的适用版本的方法。

Stringextends Object,所以总是调用使用 String 作为参数的方法。

如果您尝试添加一个接受Integer输入的方法,它将作为模棱两可的方法抛出错误,因为String它们Integer都比 Object 更具体,但没有一个比另一个更具体

于 2013-10-18T15:09:31.357 回答
0

public void method1(String str) 将被执行,因为对象是字符串超类,因此将调用字符串方法。

于 2013-10-18T15:09:26.703 回答