【问题标题】:Null is of reference type, is it a String reference or Object reference? [duplicate]Null 是引用类型,是 String 引用还是 Object 引用? [复制]
【发布时间】:2015-04-12 23:18:31
【问题描述】:

null 是一个引用,它只是null 类型,即null 不是对象类型。 但是,当我运行以下代码 sn-p 时,当我将 null 传递给方法 method(null); 时,我很惊讶它调用 method(String s) 而不是 method(Object o)

如果null本身是Java定义的类型而不是对象类型,那为什么它调用method(String s)而不是method(Object o)

public class Test {
    public static void main(String[] args) {
        method(null);
    }
    public static void method(Object o) {
        System.out.println("Object impl");
    }
    public static void method(String s) {
        System.out.println("String impl");
    }
}

编辑

我又添加了一种方法:

public static void method(Integer s) {
   System.out.println("String impl11");
}

现在编译器给出错误The method method(Object) is ambiguous for the type Test

Integer a = null;

如果合法,那为什么我会看到编译时异常?

【问题讨论】:

  • @ThomasStets 我不认为这是重复的问题
  • @Priya 是的。阅读这个问题,它问的问题完全相同,只是方法参数的类型不同。
  • 基本上是同一个问题:重载的方法,用空参数调用,为什么调用这个而不是那个。而答案也是一样的。

标签: java oop object


【解决方案1】:

null 可分配给任何引用类型。当涉及方法重载时,编译器总是更喜欢具有更具体参数类型的方法。因此带有String 参数的方法优于带有Object 参数的方法,因为StringObject 的子类。

另一方面,如果在具有不相关参数类型的方法之间进行选择 - 例如 method(String s)method (Integer i) - 代码不会通过编译,因为没有一个选项优先于另一个。

【讨论】:

  • 我已经编辑了我的问题
  • @Priya 我已经编辑了答案以解决您的编辑问题。
  • 表示StringInteger ..... 是对象类的子类,这就是编译器混淆调用哪个方法的原因,对吗?
  • @Priya String 既不是 Integer 的子类,也不是 Integer 的子类或 String。因此,编译器在两者之​​间没有偏好。
  • 感谢您回答我的问题。
猜你喜欢
  • 2015-11-09
  • 2013-09-15
  • 2010-12-04
  • 2012-02-24
  • 2013-07-14
  • 2013-01-11
  • 2010-11-07
  • 2011-01-21
  • 1970-01-01
相关资源
最近更新 更多