当前位置: 首页 > 知识库问答 >
问题:

方法重载并传递null[重复]

韦衡
2023-03-14

我在一个类中重载了以下2个方法:

public class Test{

  public static void main(String []args) throws ParseException{
       Test t = new Test();
      t.testMethod(null);
  }

  public void testMethod(Object o){
    System.out.println("Object");
  }

  public void testMethod(String s){
    System.out.println("String");
  }
}

当我调用方法testMethod时,它会打印“String”。

当我再添加一个重载方法时:

public void testMethod(StringBuilder sb){
    System.out.println("String");
}

它抛给我编译器错误:方法testMethod对于类型Test是矛盾的。

当我用null调用方法时,所有这些都会发生

我的问题是:

  1. 为什么它打印字符串而不是对象?
  2. 为什么添加第三种方法会出现编译错误?

共有3个答案

符允晨
2023-03-14

在case1字符串从对象继承的情况下,它们位于继承链中,null与两者都匹配,编译器选择更具体的类型-字符串。

若2字符串和StringBuilder不在继承链中,编译器将无法选择更具体的类型。

重载方法解析的详细信息在JLS 15.12.2中进行了描述。

萧元徽
2023-03-14

为什么它打印字符串而不是对象?

java编译器选择具有最特定或最不通用参数的方法。由于Object是所有类(包括String)的Superclass,因此选择了String类。

为什么添加第三种方法会出现编译错误?

由于StringStringBuilder位于Object下方,编译器会发现调用不明确,因为StringStringBuilder都可以接受null,编译器无法确定要调用哪个方法,因此在编译过程中会出现错误。

如果您使用IOExceptionFileNotFoundException而不是StringStringBuilder尝试同样的事情,您会发现FileNotFoundException被选中,因为它是最不通用的。

彭海阳
2023-03-14

方法解析通过选择适用于给定参数的最具体的方法来工作。在您的第一种情况下,StringObject更“具体”(因为它是Object的子类),因此选择了String方法。

当您添加另一个采用StringBuilder的方法时,that和String方法都同样“特定”(它们都是Object的直接子类),因此对于应该选择哪个存在歧义,因此出现错误。

 类似资料:
  • 我无法理解为什么这个程序打印字符串 请帮助我了解如何打印Sting而不是Object

  • 我有以下代码: 我知道对于1和3,它打印“2”,因为调用了最特定的参数类型。但无法理解为什么2打印“2”。

  • 在以下程序中: 输出为“str”,有人能解释一下为什么要打印str吗?我无法理解这一点。

  • 我正在Java中练习一些例子。代码如下所示: 关于这一点,我没有什么问题, 1) 上面的代码使用method1(算术异常e)执行并打印null,为什么不使用异常(因为它位于层次结构的顶部)? 猜测:这是因为与异常相比,算术异常更加具体。如果是这样,为什么要问第二个问题 2) 通过在现有代码中引入以下方法,程序显示编译时异常。为什么? 帮助我学习。谢谢

  • 如果有人能在下面解释一下,那就太好了。为什么在下面的示例中调用了打印(字符串s)方法,而未调用打印(对象o)。

  • 可能重复:NULL参数的方法重载 以下代码编译并运行良好。 在此代码中,要调用的方法是接受字符串类型参数的方法 医生说。 如果多个成员方法既可访问又适用于方法调用,则需要选择一个来为运行时方法调度提供描述符。Java编程语言使用选择最具体方法的规则。 但我不明白,当代码中接受原语int参数的方法之一被修改为接受包装器类型Integer的参数时,例如, 发出编译时错误。 对temp的引用不明确,me