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

参数为null的重载方法调用

东方富
2023-03-14
问题内容

在下面的代码中,输出为

如果我使用类型为参数的方法删除该方法,String则输出为

目的

我知道当参数类型不完全匹配时方法的重载行为如何,但是我不明白如何将 null 视为Object和/或String参数。

这有什么解释?

class C {

    static void m1(Object x) {
        System.out.print("Object");
    }
    static void m1(String x) {
        System.out.print("String");
    }

    public static void main(String[] args) {
        m1(null);
    }
}

问题答案:

根据Java规范
15.12.2.5节,它始终使用最特定的方法。

简介相当具体:

如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用选择最具体方法的规则。

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

一般来说,至少对于代码可读性而言,最好总是尽可能地明确。您可以将自己null转换为与要调用的签名匹配的类型。但这绝对是一个有问题的做法。它假定每个人都知道此规则,并使代码更难阅读。

但这是一个很好的学术问题,所以我+1您的问题。



 类似资料:
  • 我是新来的百里香,我有以下问题。我想在html模板内调用一个java方法,但该方法需要一个参数,但问题是,无论我为参数传递什么,结果总是空的。 类别。html: 分类控制器:

  • 问题内容: 我试图以反射方式在Java中调用此方法: 问题是我想将null传递为,以便foo变为null。 但是,在以下方法中,它假定没有参数,并且我得到(): 这是如何完成的? 问题答案: 尝试

  • 问题内容: 我在测验中遇到了这个问题, 该程序的输出为“字符串版本”。但是我不明白为什么将null传递给重载方法会选择字符串版本。字符串变量null是否指向空? 但是,当代码更改为 它给出了一个编译错误,指出“对于MoneyCalc类型,方法method(StringBuffer)是不明确的” 问题答案: 字符串变量null是否指向空? 空引用可以转换为任何类类型的表达式。因此,对于,这很好: 选

  • 问题内容: 如果我有一个vararg Java方法并调用,则我和 都将null。但是,如果我呼叫f,则其本身为null。为什么会这样呢? 我应该怎么称呼这样的? 问题答案: 问题是,当你使用原义null时,Java不知道它应该是哪种类型。它可以是空对象,也可以是空对象数组。对于单个参数,假定为后者。 你有两种选择。将null显式转换为Object或使用强类型变量调用该方法。请参见下面的示例: 输出

  • 我在一个类中重载了以下2个方法: 当我调用方法testMethod时,它会打印“String”。 当我再添加一个重载方法时: 它抛给我编译器错误:是矛盾的。 当我用null调用方法时,所有这些都会发生 我的问题是: 为什么它打印字符串而不是对象? 为什么添加第三种方法会出现编译错误?

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