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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kimi 中级黑马   /  2013-6-10 13:18  /  2147 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 kimi 于 2013-6-11 00:16 编辑

public class Test2 {

        public static void main(String[] args) {
                test(null);
        }
        public static void test(Object o){
                System.out.println(o);
        }
        public static void test(String s){
                System.out.println(s);
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

14 个回复

倒序浏览
可以把代码修改成这样试一下啊

  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 test(null);
  4.         }
  5.         public static void test(Object o){
  6.                 System.out.println("o");
  7.         }
  8.         public static void test(String s){
  9.                 System.out.println("s");
  10.         }
  11. }
复制代码
结果输出
s

所以是调用了test(String s)方法。
String是Object的子类,调用重载方法的时候优先调用范围小的(这里就是参数为String对象的)。
我是这么理解的暂时。

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 同意

查看全部评分

回复 使用道具 举报
显然是对象这个方法,null属于一个对象不是字符串,所以调用第一个方法。要想调用第二个改为test(“null”)就行了。明白了吗?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
Renica 发表于 2013-6-10 13:55
显然是对象这个方法,null属于一个对象不是字符串,所以调用第一个方法。要想调用第二个改为test(“null”) ...

看一本书上讲null单独是一种特殊的类型,表示引用变量谁都不指向。楼主说的Object和String都是引用对象。
回复 使用道具 举报
shang1jk 发表于 2013-6-10 13:57
看一本书上讲null单独是一种特殊的类型,表示引用变量谁都不指向。楼主说的Object和String都是引用对象。 ...

我自己感觉应该是一个特殊的对象,我实验了一次就是答案和我的一样。共同学习吧,等后面的人再学学。呵呵
回复 使用道具 举报
Renica 发表于 2013-6-10 14:04
我自己感觉应该是一个特殊的对象,我实验了一次就是答案和我的一样。共同学习吧,等后面的人再学学。呵呵 ...

好奇怪,我按前面的代码实验的是调用的String那个啊……
等高手指点。
回复 使用道具 举报
Renica 中级黑马 2013-6-10 14:16:55
7#
shang1jk 发表于 2013-6-10 14:11
好奇怪,我按前面的代码实验的是调用的String那个啊……
等高手指点。

刚才我失误了,调用的是String方法,我也不知道了。呵呵
回复 使用道具 举报
这个问题看出楼主的思想很细腻。我觉着如能null如能找到有具体类型参数的方法,调用的就是带有具体参数类型的方法,
如果没有就是去调用“上帝”参数的方法,感觉和现实生活很相似,当优质目标值达不到的时候,再退而求其次。

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
刘凯 金牌黑马 2013-6-10 15:21:22
9#
我刚刚也试过了  第二个方法的参数 换成Object 任意一个子类  都会去选择执行这个方法  ,  如果换成基本数据类型  就会选择执行Object参数的方法  所以比较认同楼上见解
由于参数为null,所以可以指向任意Object 和 Object子类, 而基本数据类型不属于Object 所以这个不成立 退而求其次 选择了Object

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
我感觉也应该是调用第一个的啊,因为null表示的是一个空的对象吧,又不是表示一个空的字符串。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 鼓励新人,加油

查看全部评分

回复 使用道具 举报
刘凯 发表于 2013-6-10 15:21
我刚刚也试过了  第二个方法的参数 换成Object 任意一个子类  都会去选择执行这个方法  ,  如果换成基本数 ...

我去 这个题还挺好的 真的很奇葩 嘿嘿 我也同意你的说法 嘿嘿
回复 使用道具 举报
Java的重载解析过程可以分为两个阶段。
第一阶段,选取所有可获得并且可应用的方法或构造器。
第二阶段,在第一阶段选择的方法或构造器中选取最精确的一个。
回复 使用道具 举报
同一个类中方法的重载,null是关键字,代表一个空的对象,应该去调用第一个方法的。
回复 使用道具 举报
本帖最后由 hm_李大强 于 2013-6-10 22:13 编辑

通过断点发现调用的是test(String s)。java1.7中 String s = null; 是不报错的允许的。 但是不能调用String类中的方法,楼主可以试试String s =null; s+=null; System.out.println(s.length());值是为8的说明Null被当作"null"字符串处理了
回复 使用道具 举报
public static void main(String[] args) {
          test(null);
  }
  public static void test(Object o){
          System.out.println("参数是Object类型的方法");
          System.out.println(o);
  }
  public static void test(String s){
          System.out.println("参数是String类型的方法");
          System.out.println(s);
  }
你可一加一些提示的语句 这样就知道调用的是那个了!
输出的结果是:
参数是String类型的方法
null

我认为是不是String是Object类型的子类,所以调用的时候是从参数为子类的方法调用!不知道可不可以这样理解,希望有所帮助!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马