public class Test
{
public Test(Object o) {
System.out.println("object");
}
public Test(int[] o) {
System.out.println("array");
}
public static void main(String[] args) {
new Test(null);
}
}
输出:
array
有人可以解释一下这背后的原因吗?
答案 0 :(得分:7)
规则是:将更具体的方法称为。在这种情况下,接收int[]
的方法比接收java.lang.Object
参数的方法更具体。
Here's a link参考Java的官方文档,引用了这个案例。请查看 15.2.2 部分。引用一个有趣的部分(第15.2.2.5节):
如果多个成员方法都可访问且适用于a 方法调用,有必要选择一个提供 运行时方法调度的描述符。 Java编程 language使用选择最具体方法的规则。
非正式的直觉是一种方法更具体 如果可以传递第一个方法处理的任何调用,则为另一个 没有编译时类型错误的另一个。
另一个:
可能没有方法是最具体的,因为有 两种或多种最具体的方法。在这种情况下:
如果所有最大特定方法都具有覆盖等效方法 (§8.4.2)签名,然后:如果恰好其中一个最大特定 方法不是抽象的,它是最具体的方法。 否则,如果声明了所有最大特定方法 摘要,以及所有最大特定方法的签名 具有相同的擦除(§4.6),然后选择最具体的方法 任意地在最大特定方法的子集中 具有最具体的返回类型。但是,最具体的方法 当且仅当如此时,才会被视为抛出已检查的异常 异常或其擦除在每个的throws子句中声明 最具体的方法。否则,我们说的方法 调用不明确,发生编译时错误。
答案 1 :(得分:1)
总是子类比父类更受欢迎。如果要调用Object 1,可以执行以下操作:
new goFuncTest((Object) null);
答案 2 :(得分:1)
正如 pablo的答案所示,将调用最具体/最不通用的方法。实际上,检查类层次结构中的类 level 以决定调用哪个方法。调用具有较低类级别的方法。
如果2个类处于同一级别,那么您将收到一个编译时错误,指出 - ambiguous method call
,就像下面的情况一样。
public class Sample {
void someMethod(Object o) {
System.out.println("object");
}
void someMethod(String s) {
System.out.println("String");
}
void someMethod(int[] o) {
System.out.println("int[]");
}
public static void main(String[] args) {
new Sample().someMethod(null); // error ambiguous call both array and String are direct children of Object
}
案例-2:证明将调用具有较低级别级别的方法。
public class Sample {
void someMethod(Object o) {
System.out.println("object");
}
void someMethod(OutputStream os) {
System.out.println("OutputStream");
}
void someMethod(FileOutputStream fos) {
System.out.println("FileOutputStream");
}
public static void main(String[] args) {
new Sample().someMethod(null);
}
}
O / P:
FileOutputStream
因为FileOutputStream是OutputStream的子节点,它又是Object类的子节点(FileOutputStream也是OutputStream和Object类的子节点)。因此编译器在解析方法调用时会像Object --> OutputStream --> FileOutputStream
一样。
答案 3 :(得分:0)
Thumb方法在方法调用中是第一个。由于Object是all的父级,并且null可以分配给任何类型的对象实例变量,它将首先匹配任何java类型(当然是对象的子级),然后匹配超级父级,即Object。
答案 4 :(得分:0)
将Null渐变为数组优于将其转换为Object。对象在层次结构中位于顶部,而Array最接近Null。
这就像字节到int的渐变。