Java 传递null时,重载期间将调用哪个方法
在以下程序中:Java 传递null时,重载期间将调用哪个方法,java,overloading,Java,Overloading,在以下程序中: 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(Strin
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吗?我无法理解这一点。将执行public void method1(String str),因为对象是String supperclass,因此将调用String方法。Java尝试使用方法的最具体适用版本
String
扩展了Object
,因此总是调用使用String作为参数的方法
如果您尝试添加一个接受整数
输入的方法,它将作为不明确的方法抛出错误,因为字符串
和整数
这两个方法都比Object更具体,但没有一个比Rohit解释的另一个更具体
这是因为字符串类是从对象扩展而来的,因此更加复杂
特定于对象。所以,编译器决定调用该方法。
记住,编译器总是选择最具体的方法来调用
如果多个成员方法可访问且适用于
方法调用时,必须选择一个来提供
运行时方法分派的描述符。Java编程
语言使用的规则是选择最具体的方法
非正式的直觉是,一种方法比另一种方法更具体
如果可以传递第一个方法处理的任何调用,则另一个
在没有编译时类型错误的情况下打开另一个
但是,如果有两个参数为String和Integer的方法,
然后您将得到null的歧义错误,因为编译器无法决定
哪一种更具体,因为它们是非协变类型
如JLS第节所述
这不是多态性。它超载了。太好了,为什么?这个答案对任何人都没有帮助。@Tenner我更新了解释。对不起,没有仔细阅读这个问题。你能重新考虑一下我的答案吗