我在一个类中重载了以下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调用方法时,所有这些都会发生
我的问题是:
在case1字符串从对象继承的情况下,它们位于继承链中,null与两者都匹配,编译器选择更具体的类型-字符串。
若2字符串和StringBuilder不在继承链中,编译器将无法选择更具体的类型。
重载方法解析的详细信息在JLS 15.12.2中进行了描述。
为什么它打印字符串而不是对象?
java编译器选择具有最特定或最不通用参数的方法。由于Object
是所有类(包括String
)的Superclass,因此选择了String
类。
为什么添加第三种方法会出现编译错误?
由于String
和StringBuilder
位于Object
下方,编译器会发现调用不明确,因为String
和StringBuilder都可以接受
null
,编译器无法确定要调用哪个方法,因此在编译过程中会出现错误。
如果您使用
IOException
和FileNotFoundException
而不是String
和StringBuilder
尝试同样的事情,您会发现FileNotFoundException
被选中,因为它是最不通用的。
方法解析通过选择适用于给定参数的最具体的方法来工作。在您的第一种情况下,String
比Object
更“具体”(因为它是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