黑马程序员技术交流社区

标题: 该使用哪个构造的疑问 [打印本页]

作者: 赵侃    时间: 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