黑马程序员技术交流社区

标题: 函数重载的问题 [打印本页]

作者: 为你而去    时间: 2014-4-8 00:12
标题: 函数重载的问题
Overloading1.java无法通过编译,但Overloading2.java却顺利通过编译。这是为什么?


public class Overloading1 {
      static void f(float i, Character... args) {
            System.out.println("first");
      }
      static void f(Character... args) {
            System.out.print("second");
      }
      public static void main(String[] args) {
            f(1, 'a');
            f('a', 'b');
     }
}  


public class Overloading2 {
       static void f(float i, Character... args) {
               System.out.println("first");
       }
       static void f(char c, Character... args) {
              System.out.println("second");
       }
       public static void main(String[] args) {
             f(1, 'a');
             f('a', 'b');
      }
}

输出:
first
second[/code]
作者: jingdou56    时间: 2014-4-8 01:03
问题都在 f('a','b') 这句上!

因为'a'对应的ASCII 值是 97,所以编译也认为'a'是 97.0,

所以 java 编译器在编译时,Overloading1 中 f('a','b') 这句,两个方法的优先级是一样的(个人理解,也不知道这样说对不对)java 编译器不能识别它对应的到底是哪个方法!

所以就会报错了!

Overloading2 中有 char 类型的参数,所以直接对应的是就是第二个方法
作者: linweiwen    时间: 2014-4-8 01:21
就是楼上说的那句错了,
编译的时候有"歧义",
f((float)'a', 'b');这样写才能消除歧义。

当然你改其他地方,反正就是类型对了就可以了,
感觉深究这种错误,有点死扣啊。




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