黑马程序员技术交流社区

标题: 主函数调用的是哪个方法 [打印本页]

作者: kimi    时间: 2013-6-10 13:18
标题: 主函数调用的是哪个方法
本帖最后由 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);
        }
}
作者: shang1jk    时间: 2013-6-10 13:55
可以把代码修改成这样试一下啊

  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对象的)。
我是这么理解的暂时。
作者: Renica    时间: 2013-6-10 13:55
显然是对象这个方法,null属于一个对象不是字符串,所以调用第一个方法。要想调用第二个改为test(“null”)就行了。明白了吗?

作者: shang1jk    时间: 2013-6-10 13:57
Renica 发表于 2013-6-10 13:55
显然是对象这个方法,null属于一个对象不是字符串,所以调用第一个方法。要想调用第二个改为test(“null”) ...

看一本书上讲null单独是一种特殊的类型,表示引用变量谁都不指向。楼主说的Object和String都是引用对象。
作者: Renica    时间: 2013-6-10 14:04
shang1jk 发表于 2013-6-10 13:57
看一本书上讲null单独是一种特殊的类型,表示引用变量谁都不指向。楼主说的Object和String都是引用对象。 ...

我自己感觉应该是一个特殊的对象,我实验了一次就是答案和我的一样。共同学习吧,等后面的人再学学。呵呵
作者: shang1jk    时间: 2013-6-10 14:11
Renica 发表于 2013-6-10 14:04
我自己感觉应该是一个特殊的对象,我实验了一次就是答案和我的一样。共同学习吧,等后面的人再学学。呵呵 ...

好奇怪,我按前面的代码实验的是调用的String那个啊……
等高手指点。
作者: Renica    时间: 2013-6-10 14:16
shang1jk 发表于 2013-6-10 14:11
好奇怪,我按前面的代码实验的是调用的String那个啊……
等高手指点。

刚才我失误了,调用的是String方法,我也不知道了。呵呵
作者: 不破大地    时间: 2013-6-10 14:36
这个问题看出楼主的思想很细腻。我觉着如能null如能找到有具体类型参数的方法,调用的就是带有具体参数类型的方法,
如果没有就是去调用“上帝”参数的方法,感觉和现实生活很相似,当优质目标值达不到的时候,再退而求其次。
作者: 刘凯    时间: 2013-6-10 15:21
我刚刚也试过了  第二个方法的参数 换成Object 任意一个子类  都会去选择执行这个方法  ,  如果换成基本数据类型  就会选择执行Object参数的方法  所以比较认同楼上见解
由于参数为null,所以可以指向任意Object 和 Object子类, 而基本数据类型不属于Object 所以这个不成立 退而求其次 选择了Object
作者: 世界公民    时间: 2013-6-10 15:27
我感觉也应该是调用第一个的啊,因为null表示的是一个空的对象吧,又不是表示一个空的字符串。
作者: 张歆明    时间: 2013-6-10 15:29
刘凯 发表于 2013-6-10 15:21
我刚刚也试过了  第二个方法的参数 换成Object 任意一个子类  都会去选择执行这个方法  ,  如果换成基本数 ...

我去 这个题还挺好的 真的很奇葩 嘿嘿 我也同意你的说法 嘿嘿
作者: 黑马伍哲沂    时间: 2013-6-10 18:35
Java的重载解析过程可以分为两个阶段。
第一阶段,选取所有可获得并且可应用的方法或构造器。
第二阶段,在第一阶段选择的方法或构造器中选取最精确的一个。
作者: j816326    时间: 2013-6-10 21:23
同一个类中方法的重载,null是关键字,代表一个空的对象,应该去调用第一个方法的。
作者: hm_李大强    时间: 2013-6-10 22:09
本帖最后由 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"字符串处理了
作者: 杨增坤    时间: 2013-6-10 23:53
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类型的子类,所以调用的时候是从参数为子类的方法调用!不知道可不可以这样理解,希望有所帮助!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2