【问题标题】:Java overloading example with null [duplicate]带有 null 的 Java 重载示例 [重复]
【发布时间】:2019-07-19 02:03:02
【问题描述】:

为什么这里将原始 1 视为对象而将 null 视为 String

public class Sample7 {

    public void getName(String s) {
        System.out.println(s + "string");
    }

    public void getName(Object o) {
        System.out.println(o + "object");
    }
}

class Test {
    public static void main(String args[]) {
        Sample7 s = new Sample7();
        s.getName(null);
        s.getName(1);
    }
} 

输出:

nullstring

1object

输出背后的逻辑是什么??

【问题讨论】:

  • 期望什么输出?

标签: java overloading


【解决方案1】:

Primite 值将自动装箱为其对象表示,因此 1 将变为 Integer。但是你没有Integer 的重载方法,所以它会匹配Object,因为IntegerObject,而不是String

另一方面,null 的情况更有趣一些。 null 可以是任何类型的对象,因此在这种情况下,最窄的类型是 String。这就是为什么它匹配String 而不是Object

如果添加另一个方法getName(Integer i),编译器会在调用s.getName(null)时抛出Amgibigous method call错误,原因相同——null可以同时是StringInteger

【讨论】:

    【解决方案2】:

    为什么 null 被认为是字符串:

    Java 中的任何变量/值都可以为空,这就是为什么你有nullstring,因为你将字符串传递给getName(String s)

    为什么原语 1 被视为对象

    getName(Object o) 因为你的方法没有接受整数的显式签名,所以 Java 中的所有值都是 Object 的实例,这就是 getName(int) 映射到 getName(Object) 的原因。 1 是一个对象。 Java 对声明为 Object 的原始类型 [ String, int, double, float, boolean ] 进行隐式类型转换。这就是你得到值 1 的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2018-01-16
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多