在以下程序中:
public class PolyEx1 {
public static void main(String[] args) {
A refA = new A();
refA.method1(null);
}
}
class A {
public void method1(Object o) {
System.out.println("o");
}
public void method1(String str) {
System.out.println("str");
}
}
输出为“str”,有人能解释一下为什么要打印str吗?我无法理解这一点。
public ulul方法1(String str)将被执行,因为对象是字符串超类,因此将调用字符串方法。
Java尝试使用最具体适用的方法版本。
String
扩展了对象,因此总是调用使用String作为参数的方法。
如果您尝试添加一个接受intger
输入的方法,它会将错误作为不明确的方法抛出,因为String
和intger
它们都比Object更具体,但没有一个比另一个更具体
正如Rohit在这里解释的那样,
这是因为String类从Object扩展而来,所以它更特定于Object。所以,编译器决定调用该方法。记住,编译器总是选择最具体的方法来调用。
如果一个方法调用可以访问并应用多个成员方法,则需要选择一个成员方法来为运行时方法调度提供描述符。Java编程语言使用的规则是选择最具体的方法。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法,而不会出现编译时类型错误,那么一个方法比另一个方法更具体。
然而,若您有两个参数为String和Integer的方法,那个么您将得到null的歧义错误,因为编译器无法决定哪一个更具体,因为它们是非协变类型。
如JLS第15.12.5节所述
我在一个类中重载了以下2个方法: 当我调用方法testMethod时,它会打印“String”。 当我再添加一个重载方法时: 它抛给我编译器错误:是矛盾的。 当我用null调用方法时,所有这些都会发生 我的问题是: 为什么它打印字符串而不是对象? 为什么添加第三种方法会出现编译错误?
我有以下代码: 我知道对于1和3,它打印“2”,因为调用了最特定的参数类型。但无法理解为什么2打印“2”。
我无法理解为什么这个程序打印字符串 请帮助我了解如何打印Sting而不是Object
我在超类中有一个重载方法的基本继承情况。 下面的类扩展了上面的类: main方法只是创建一个对象(静态和动态类型)并调用: 最后打印出来 看了这个,我想既然对象的静态和动态类型都是,它会调用Person中的重载方法,该方法将作为参数。由于我显然错了,我打开了一个调试器,假设类中的getWorkDetail(this)行中对“this”的引用一定已经变成了它的超级类。然而,这不是我发现的。 显然,在
我正在Java中练习一些例子。代码如下所示: 关于这一点,我没有什么问题, 1) 上面的代码使用method1(算术异常e)执行并打印null,为什么不使用异常(因为它位于层次结构的顶部)? 猜测:这是因为与异常相比,算术异常更加具体。如果是这样,为什么要问第二个问题 2) 通过在现有代码中引入以下方法,程序显示编译时异常。为什么? 帮助我学习。谢谢
如果有人能在下面解释一下,那就太好了。为什么在下面的示例中调用了打印(字符串s)方法,而未调用打印(对象o)。