给出以下代码:
class Overloading
extends Object
{
static public void target(Object val, String chk) { System.out.println("Object["+val+"] :: Should be "+chk); }
static public void target(String val, String chk) { System.out.println("String["+val+"] :: Should be "+chk); }
static public void main(String[] args) {
Object obj=null;
target(null ,"Object");
target((Object)null,"Object");
target(obj ,"Object");
}
}
输出(意外)如下:
String[null] :: Should be Object
Object[null] :: Should be Object
Object[null] :: Should be Object
问题出在第一行,我希望与其他两行相同。此外,我发誓直到最近,编译器仍会为我的普通null
调用给出模糊的调用警告。但是,使用Java
5和6进行编译和测试会产生相同的结果。
这对我来说是一个重要的问题,因为我有很多代码都使用这种模式,即使用不同类型的重载“默认”参数来选择返回类型并推断所需的转换/解析。谁能解释这是怎么回事?
Java始终以相同的方式工作:始终选择“最特定”的适用重载。由于String
是的子类Object
,因此它是“更具体的”,并且String
选择了重载。如果重载是针对(例如String
和)的Integer
,而您尝试传递null
,那么您确实会得到编译时的歧义错误,因为它们都处于同一继承层次结构的同一级别。
问题内容: 我试图弄清楚Java如何选择执行哪种方法: 我在这里学到的是 方法签名是根据编译时数据类型确定的 实际调用的方法取决于调用该方法的对象的动态类型。 基于此,前两个调用的结果符合预期。但是,我不理解示例3和4的结果。 它似乎是在Java语言规范中指定的,但我不理解。 问题答案: 但是,我不理解示例3和4的结果。 好吧,让我们单独看一下。 例子3 重要的部分是表达式和的 编译时 类型。 仅
我在一次测验中遇到了这个问题, 这个程序的输出是“String Version”。但我无法理解为什么将null传递给重载方法会选择字符串版本。null是指向任何内容的String变量吗? 但是,当代码更改为时, 它给出了一个编译错误,说“方法方法(StringBuffer)对于MoneyCalc类型是模糊的”
本文向大家介绍Java中的方法重载和空错误,包括了Java中的方法重载和空错误的使用技巧和注意事项,需要的朋友参考一下 在Java中重载方法时,这些函数具有相同的名称,并且该函数的参数数目相同。在这种情况下,如果参数不是原始的并且具有接受空值的能力,则在使用空值调用该函数时,编译器会感到困惑,因为它无法选择其中一个,因为它们都具有接受空值的能力。这会导致编译时错误。 示例 以下是显示相同内容的示例
我有以下代码片段: 如果我调用foo(null)为什么没有歧义?为什么程序调用foo(字符串x)而不是foo(对象x)?
问题内容: 如果我用Java编写此行: 将调用哪种方法? 我可以测试一下。但是在其他类似情况下,我想知道会发生什么。 问题答案: 在最具体的方法将被调用-在这种情况下, 这通常在规范(15.12.2)中的过载解析的“确定方法签名”步骤下进行,尤其是在“选择最特定的方法”下。 在不涉及细节的情况下(你可以在此处像在规范中阅读的一样详细),引言给出了很好的总结: 如果可以访问多个成员方法并将其应用于方
重载子类中重写的方法,我是重载父方法还是重载子类方法? 我大体上理解什么是超载和超驰。 重载-同一方法在同一个类中有不同的参数和可能的返回类型。 重写-子类中的方法签名与父类中的方法签名相同,但实现不同。 方法B.a(INTX)是重载a.a还是重载B.a?