以下程序的输出是1,3,3可以有人解释一下吗?

时间:2015-06-18 12:34:40

标签: java

以下程序的输出是1,3,3可以有人解释一下吗? 它会将10.25视为方法参数的对象吗?

public class Test {
  void methodOfTest(int i) {
    System.out.println(1);
  }

  void methodOfTest(Integer I) {
    System.out.println(2);
  }

  void methodOfTest(Object o) {
    System.out.println(3);
  }

  public static void main(String[] args) {
    Test t = new Test();

    t.methodOfTest(10);

    t.methodOfTest(10.25);

    t.methodOfTest(new Double("25.25"));
  }
}

4 个答案:

答案 0 :(得分:7)

t.methodOfTest(10);

10被解释为int字面值,因此methodOfTest(int i)被称为

t.methodOfTest(10.25);

没有方法需要double,因此10.25适合的唯一方法是methodOfTest(Object o)

t.methodOfTest(new Double("25.25"));

此处我们有一个Double对象,但同样没有找到带Double的方法,所以唯一采用此方法的方法是methodOfTest(Object o)

因此您的输出为1,3,3

答案 1 :(得分:1)

它不认为10.25是一个对象。它确实将它赋值为可转换为Object引用,方法是将转换转换为Double引用,然后加宽引用转换。

答案 2 :(得分:0)

拳击答案绝对正确。
我只是想补充一点:你可能期望从Double到Integer的自动(隐式)转换,但必须明确声明这种转换(将Double转换为Integer)。
如果没有显式转换,您的Double值将被解释为Object(因为您提供了该方法重载),它是关于所有内容的基类。

希望这会有所帮助;)

答案 3 :(得分:-1)

因为10.25可以转换为Double。 (拳击成双) 所以Double的构造函数将以10.25作为参数调用,并将传递给方法:void methodOfTest(Object o)。