当前位置: 首页 > 面试题库 >

Java当参数为原义null值时,如何选择重载方法?

湛鸿雪
2023-03-14
问题内容

我在测验中遇到了这个问题,

public class MoneyCalc {

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

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

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}

该程序的输出为“字符串版本”。但是我不明白为什么将null传递给重载方法会选择字符串版本。字符串变量null是否指向空?

但是,当代码更改为

public class MoneyCalc {

   public void method(StringBuffer sb) {
      System.out.println("StringBuffer Verion");
   }

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

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}

它给出了一个编译错误,指出“对于MoneyCalc类型,方法method(StringBuffer)是不明确的”


问题答案:

字符串变量null是否指向空?

空引用可以转换为任何类类型的表达式。因此,对于String,这很好:

String x = null;

String选择此处的重载是因为Java编译器根据JLS的15.12.2.5节选择了最具体的重载。尤其是:

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而没有编译时类型错误,则一个方法比另一个方法更具体。

在第二种情况下,这两种方法仍然适用,但是两者String都不StringBuffer比另一个更具体,因此这两个方法都不比另一个更具体,因此会出现编译器错误。



 类似资料:
  • 我在一次测验中遇到了这个问题, 这个程序的输出是“String Version”。但我无法理解为什么将null传递给重载方法会选择字符串版本。null是指向任何内容的String变量吗? 但是,当代码更改为时, 它给出了一个编译错误,说“方法方法(StringBuffer)对于MoneyCalc类型是模糊的”

  • 问题内容: 我试图弄清楚Java如何选择执行哪种方法: 我在这里学到的是 方法签名是根据编译时数据类型确定的 实际调用的方法取决于调用该方法的对象的动态类型。 基于此,前两个调用的结果符合预期。但是,我不理解示例3和4的结果。 它似乎是在Java语言规范中指定的,但我不理解。 问题答案: 但是,我不理解示例3和4的结果。 好吧,让我们单独看一下。 例子3 重要的部分是表达式和的 编译时 类型。 仅

  • 问题内容: 我正在尝试以下代码: 打印三遍。我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗?是否有修改此代码,以便它会打印的方式, 问题答案: 我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗? 是。您的期望是错误的。在Java中,动态方法分派仅发生在调用方法的对象上,而不发生在重载方法的参数类型上。 引用Java语言规范: 调用方法时(第15.12节),实际参数

  • 问题内容: 在下面的代码中,输出为 串 如果我使用类型为参数的方法删除该方法,则输出为 目的 我知道当参数类型不完全匹配时方法的重载行为如何,但是我不明白如何将 null 视为和/或参数。 这有什么解释? 问题答案: 根据Java规范 15.12.2.5节,它始终使用最特定的方法。 简介相当具体: 如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Ja

  • 问题内容: 在这里,输出是 字符串空 JVM为什么使用String参数将方法解析为一种? 在此先感谢J 问题答案: 这是一个相当复杂的算法,在JLS 15.12中进行了 详细介绍。但是这里相关的部分是15.12.2,它说“选择了最具体的部分”。对象和字符串重载都是“可访问且适用的”(字符串适用,因为空文字是所有类型的引用),并且字符串更具体。 编辑:根据语法更正的部分。

  • 问题内容: 通过我可以参数化这样的查询; 但是问题在于,如果a为None,则查询应如下所示; 因此,当查询可以为None或字符串时,查询应如何? 问题答案: 解决方案是使用ISO / ANSI标准-安全比较: 并非所有数据库都支持此功能,因此您还可以使用: 如果您不愿意两次传递参数,则可以在子句中包含它: