我有这段代码:
class SuperClass {
int method(Object o){
return 1;
}
int method(String s){
return 2;
}
}
public class PassingNull extends SuperClass {
int method(Object s) {
return 3;
}
public static void main(String... a){
SuperClass sc = new SuperClass();
PassingNull sb = new PassingNull();
SuperClass st = new PassingNull();
System.out.println(sc.method(null)); //1
System.out.println(sb.method(null)); //2
System.out.println(st.method(null)); //3
}
}
据我所知,对于1和3,它会打印'2',因为会调用最具体的参数类型。但无法理解为什么2打印'2'。
答案 0 :(得分:3)
基本上,出于与案例1和案例2相同的原因。
如您所知, SuperClass
有两个名为method
的方法。其中一个需要Object
而另一个需要String
,后者更具体 - 所以传递null
指的是第二个(更具体)方法,因为{{1适用于两者。
现在,null
还有两个名为PassingNull
的方法。和以前一样,一个重载需要method
(覆盖Object
的那个),另一个需要SuperClass::method(Object)
(直接从String
继承的那个) 。所以它是类似的情况,这意味着类型解析将类似地工作:假设两个重载都适用,更具体的一个 - 需要SuperClass
- 是将被调用的那个。