对象与字符串方法

时间:2012-10-30 05:29:26

标签: java

  

可能重复:
  Overloaded method selection based on the parameter’s real type
  How is an overloaded method choosen when a parameter is the literal null value?

当我执行下面的代码时,我得到以下输出:

  

带有String参数的方法被调用...“

为什么?

public class StringObjectPOC {

    public static void test(Object o)   {
        System.out.println("Method with Object argument Called ...");
    }
    public static void test(String str){
        System.out.println("Method with String argument Called ...");
    }
    public static void main(String[] args) {
        StringObjectPOC.test(null);
    }
}

5 个答案:

答案 0 :(得分:3)

调用中的null与test()签名匹配。您必须投射null以确保它调用其中一个。

答案 1 :(得分:2)

如果我没记错的话,类似的例子来自 Java Puzzles

null可以是String类型或Object类型。但是JVM总是会选择更强大的准确方法。

在这种情况下,String更加准确,然后Object。 (StringObject,但Object可能不是String

编写这样的代码不是一个好习惯。尝试投射参数以匹配您想要的方法,例如

public class StringObjectPOC {

    public static void test(Object o)   {
        System.out.println("Method with Object argument Called ...");
    }
    public static void test(String str){
        System.out.println("Method with String argument Called ...");
    }
    public static void main(String[] args) {
        StringObjectPOC.test((Object)null);
    }
}

答案 2 :(得分:1)

Java尝试找到可以调用的最具体方法。 String是对象的子类,因此只要可能,Java就会遵循String方法。对于Object或String,null是一个完全可接受的值,但由于String比Object更具体,因此Java遵循String方法,因为它更精确。

答案 3 :(得分:1)

我试过了:

<强> Test2.class

public class Test2{}

<强> Test3.class

public class Test3 extends Test2{

}

<强>的Test.class

public class Test{

public static void print(Object obj){
    System.out.println("Object");
}

public static void print(Test2 obj){
    System.out.println("test 2");
}

public static void print(Test3 obj){
    System.out.println("Test 3");
}


public static void main(String[]args){
    Test.print(null);
}

}

打印出测试3

就像您的场景一样,这意味着如果方法被重载(并且传递null),它会识别具有 child -most参数的方法。

Object->Test->Test2

或在你的情况下:

Object->String

答案 4 :(得分:0)

null可以是String和/或Object但由于String继承自Object,它会尝试使用签名更准确。您可以强制null选择要执行的方法:

public static void main(String[] args) {
    Test.test((Object) null); // treats as Object
    Test.test((String) null); // treats as String
    Test.test(null);          // treats as String
}