A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵侃 黑马帝   /  2011-8-9 02:55  /  2818 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[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,这是为什么呢?

6 个回复

倒序浏览
黑马网友  发表于 2011-8-9 08:30:11
沙发
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:55
藤椅

null

这里是方法的重载而不是构造方法的重载
null可以赋值给引用类型变量,不能赋值给基本类型变量。
null 代表一个不确定的对象,但它不是Object 的实例。
这段代码中,nums 是引用类型变量,所以对于重载的两个invoke方法,invoke(null); 选择调用了第二个。
回复 使用道具 举报
黑马网友  发表于 2011-8-9 11:53:19
板凳

回复

invoke(new String(""));
如果这样调用就会调用invoke(Object obj)这个方法。
可见null本身就是空对象,不确定的指向。不能作为Object的参数。
回复 使用道具 举报
黑马网友  发表于 2011-8-12 22:40:50
报纸
invoke("null");
invoke(null)
运行看看
回复 使用道具 举报
黑马网友  发表于 2011-8-23 02:32:01
地板
楼上全部拆谈,当你为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:15
7#
同意楼上:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马