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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 申俊伟 高级黑马   /  2012-9-3 17:38  /  3640 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 申俊伟 于 2012-9-4 08:40 编辑

public String testFun(String s)    {        System.out.println("String String");        return "";    }        public void testFun(Object o)    {        System.out.println("object void");    }T.testFun("123");会调用第一个方法问题:“123”也是Object类型的啊,为什么不会调用下面的方法?解释一下

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

12 个回复

倒序浏览
public String testFun(String s)   
{      
       System.out.println("String String");      
      return "";   
}        
public void testFun(Object o)   
{        System.out.println("object void");   
}
T.testFun("123");

方法重载:有两个条件,返回值类型不同,参数列表不同
第一个方法返回值类型是String
第二个方法返回值类型是void

“123”属于String类型,不属于void类型。所以T.testFun("123");
会调用第一个
回复 使用道具 举报
方法重载的要求:两同、一不同:同一类中方法名相同,参数列表不同。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系!
T.testFun("123") //这里的“123”为String类型,默认情况下,首选符合条件的方法,如果没有符合条件的参数类型,那么参数类型字段向上转型,所以首先调用第一个,如第一个不符合那么发生向上转型在调用符合的

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
楼主,"123"是String 类型

你如果直接传入123,它就会选择第二个方法。
  1. class testFun
  2. {

  3. public static String testFun(String s)
  4. {   
  5.         System.out.println("String String");
  6.         return "";
  7. }   
  8. public static void testFun(Object o)
  9. {      
  10.         System.out.println("object void");
  11. }

  12. public static void main(String[] args)
  13. {
  14. testFun(123);
  15. }

  16. }
复制代码
运行结果:

回复 使用道具 举报
冰舞世界 发表于 2012-9-3 17:50
public String testFun(String s)   
{      
       System.out.println("String String");      

我认为这应该和返回值没关系,另外方法重载中返回值不同于重载好像没关系哟!这个题目中你把第一个方法删掉,第二个方法就可以用了!
回复 使用道具 举报
杨卓儒 发表于 2012-9-3 18:04
楼主,"123"是String 类型

你如果直接传入123,它就会选择第二个方法。运行结果:

基本数据类型不属于Object类型,应该是发生了向上类型的转换!int-->Integer所以才能使用了第二种方法!
回复 使用道具 举报
重载使得java的类可以有具有多个相同方法名的方法。编译器可以通过方法的参数的类型和个数来区分他们。而返回值和异常是不能作为区别标志的。
输出String String是遵循了方法重载中准确性的原则,你可以把"123"看成String,也可以看成Object,
但是从层次上看Object处在更上层,String是从Object继续过来的,调用testFun(String s)将更准确。
假如代码再加一个重载的方法,传入的参数变为神奇的null看看就知道啦:
public class Test {
        public static void main(String[] args) {
                Test test = new Test();
                test.testFun(null);
        }

        public void testFun(String str) {
                System.out.println("String String");
        }

        public void testFun(Object o) {
                System.out.println("Object void");
        }

        public void testFun(StringBuffer sb) {
                System.out.println("StringBuffer");
        }
}

这样的代码编译会报错的,在没有参数为StringBuffer的重载方法时,是没有问题的,null你可以看成String,也可以看成Object,但是调用testFun(String str)更精准;
但是加上参数为StringBuffer的重载方法时,String 和StringBuffer没有继承上的关系, 编译器会感觉,把null看成String类型的,和StringBuffer类型的是一样精准,它就不知道调用哪个方法啦,如果把传入的参数变为"hehe"等任意的字符串,编译顺利通过,试试就知道啦

评分

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

查看全部评分

回复 使用道具 举报
武庆东 发表于 2012-9-3 18:11
基本数据类型不属于Object类型,应该是发生了向上类型的转换!int-->Integer所以才能使用了第二种方法! ...

我也没说基本数据类型属于Object类型啊
回复 使用道具 举报
冰舞世界 发表于 2012-9-3 17:50
public String testFun(String s)   
{      
       System.out.println("String String");      

哥们,他说的是参数列表,不是说的返回类型
回复 使用道具 举报
方法重载,默认会找符合的参数类型,当不存在的时候,才会发生向上转型。这个转型就是再自动,他也是要判断以后才会发生的行为。当有符合的参数列表的时候,当然会选择符合的方法调用了。"123"是String类型,而有存在参数列表是String 的方法,首选此方法了。编译器也不是傻子,这问题你想想就能理解了。
回复 使用道具 举报
袁艳超 发表于 2012-9-3 18:19
重载使得java的类可以有具有多个相同方法名的方法。编译器可以通过方法的参数的类型和个数来区分他们。而返 ...

谢谢,明白啦!
回复 使用道具 举报
武庆东 发表于 2012-9-3 18:01
方法重载的要求:两同、一不同:同一类中方法名相同,参数列表不同。至于方法的其他部分,如方法返回值类型 ...

谢谢,明白啦!
回复 使用道具 举报
冰舞世界 发表于 2012-9-3 17:50
public String testFun(String s)   
{      
       System.out.println("String String");      

兄弟,你好像理解错了吧?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马