下面是具有 3 个重载构造函数的 java 类:
public class Test {
public Test(Object i){
System.out.println("Object invoked");
}
public Test(String i){
System.out.println("String invoked");
}
public Test(int k){
System.out.println("Integer invoked");
}
public static void main(String[] args) throws Exception {
Test t = new Test(null);
}
}
如果在创建类的新实例时传递 null 值,将调用哪个构造函数?是什么原因 ?
Java总是选择最多的specific适用于您传递的参数的方法(或构造函数)。在这种情况下,就是String
构造函数——String
是一个子类Object
.
想想如果你有的话会发生什么
new Test("some string")
Both the Object
and String
构造函数在这里适用。毕竟,争论既是一个Object
and a String
. However,很明显,String
构造函数将被调用,因为它比Object
构造函数,并且在给定参数的情况下仍然适用。
null
没有什么不同;这两个构造函数仍然适用,并且String
仍然选择构造函数Object
出于同样的原因之一。
现在,如果存在两个同样“特定”的构造函数(例如,如果您有一个Integer
构造函数)调用时会出现编译错误Test(null)
.
这在以下内容中有更详细的概述JLS §15.12.2 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2:
第二步在上一步中确定的类型中搜索成员方法。此步骤使用方法名称和参数表达式的类型来定位可访问且适用的方法,即可以在给定参数上正确调用的声明。
可能有不止一种这样的方法,在这种情况下最具体的一个被选中。最具体方法的描述符(签名加返回类型)是在运行时用于执行方法分派的描述符。
确定哪种方法最具体的明确过程概述于JLS §15.12.2.5 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)