将null传递给overriden方法

时间:2015-03-03 04:53:01

标签: java

我有这段代码:

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'。

1 个答案:

答案 0 :(得分:3)

基本上,出于与案例1和案例2相同的原因。

如您所知,

SuperClass有两个名为method的方法。其中一个需要Object而另一个需要String,后者更具体 - 所以传递null指的是第二个(更具体)方法,因为{{1适用于两者。

现在,null 有两个名为PassingNull的方法。和以前一样,一个重载需要method(覆盖Object的那个),另一个需要SuperClass::method(Object)(直接从String继承的那个) 。所以它是类似的情况,这意味着类型解析将类似地工作:假设两个重载都适用,更具体的一个 - 需要SuperClass - 是将被调用的那个。