黑马程序员技术交流社区
标题:
该使用哪个构造的疑问
[打印本页]
作者:
赵侃
时间:
2011-8-9 02:55
标题:
该使用哪个构造的疑问
[code=java]public class Test05 {
public static void main(String[] args) {
invoke(null);
}
private static void invoke(Object obj) {
System.out.println("Object");
}
private static void invoke(int[] nums) {
System.out.println("Arrays");
}
}[/code]输出是Arrays,这是为什么呢?
作者:
匿名
时间:
2011-8-9 08:30
Java 1.5 增加了可变参数之后,为了兼容以前的数组参数类型,在将数组传给方法的时候,Java会将数组拆成一个个元素然后依次把元素传给数组,也就是
private static void invoke(int[] nums) {
System.out.println("Arrays");
}
这个方法中的参数会执行类似可变参数的执行方式int ... num
当程序中有两个方法,一个只有一个参数,另一个是可变参数的时候,如下程序[code=java]package cn.itcast.heima
public class OverloadVarargs
{
public void test(String msg)
{
System.out.println("只有一个字符串参数的test方法 ");
}
//因为前面已经有了一个test方法,test方法里有一个字符串参数。
//此处的长度可变形参里不包含一个字符串参数的形式
public void test(String... books)
{
System.out.println("*******形参长度可变的test方法****** ");
}
public static void main(String[] args)
{
OverloadVarargs olv = new OverloadVarargs();
//下面两次调用将执行第二个test方法
olv.test();
olv.test("aa" , "bb");
//下面将执行第一个test方法
olv.test("aa");
//下面将执行第二个test方法
olv.test(new String[]{"aa"});
}
}[/code]
作者:
匿名
时间:
2011-8-9 08:30
标题:
null
这里是方法的重载而不是构造方法的重载
null可以赋值给引用类型变量,不能赋值给基本类型变量。
null 代表一个不确定的对象,但它不是Object 的实例。
这段代码中,nums 是引用类型变量,所以对于重载的两个invoke方法,invoke(null); 选择调用了第二个。
作者:
匿名
时间:
2011-8-9 11:53
标题:
回复
invoke(new String(""));
如果这样调用就会调用invoke(Object obj)这个方法。
可见null本身就是空对象,不确定的指向。不能作为Object的参数。
作者:
匿名
时间:
2011-8-12 22:40
invoke("null");
invoke(null)
运行看看
作者:
匿名
时间:
2011-8-23 02:32
楼上全部拆谈,当你为object作过上万次的null判定,if(Object o!=null){ ...},竟然还能说null不能为Object赋值。
其次,数组本身也属于Object,很显然数组的解包与本题无关。看如下代码:
public class Test05 {
public static void main(String[] args) {
invoke(null);
}
private static void invoke(Object obj) {
System.out.println("Object");
}
/*private static void invoke(int[] nums) {
System.out.println("Arrays");
}*/
}
输出:Object
问题的关键在于,当数组和Object同时出现,为什么匹配数组,而不匹配Object。事实上,这涉及形参与实参的精确匹配问题。如上所述,数组是Object的子类,因此匹配数组要比匹配Object更为精确。
作者:
匿名
时间:
2011-8-23 19:00
同意楼上:)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2