public class B
{
    public int b(int x,long y){return 1;}
    public double b(double x,int y){return 1;}
    public static void main(String[] args)
    {
  System.out.println(new B().b(3,3));
    }
}
这段代码报错,方法引用不明确.
public class B
{
    public int b(int x,long y){return 1;}
    public double b(double x,double y){return 1;}
    public static void main(String[] args)
    {
  System.out.println(new B().b(3,3));
    }
}
这段代码通过,为什么?只不过把第二个方法的第二个参数改成了double

解决方案 »

  1.   

    public static void main(String[] args) 
        { 
    System.out.println(new B().b(3,3)); 
        } 这里的new B().b(3,3) 有问题,这两个3的意义标识的不一样,因为你第一个是double 2个是int
    若 你写这样:double aa=3;int bb=3;然后再 System.out.println(new B().b(aa,bb)); 就应该ok了,
      

  2.   

    楼主没弄明白什么是“重载”
    如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)
    很显然第一个Class B 不符合条件,编译不通过。
      

  3.   

    原因很简单,
    System.out.println(new B().b(3,3));如果没有在实参后面加上类型的话,那默认是int类型。
    以下两段代码都有一个int类型,那到底要传哪个jvm根本不法判定,因为两个都可以,两个优先级一样的!
      public int b(int x,long y){return 1;}
      public double b(double x,int y){return 1;}
    以下两段代码
     public int b(int x,long y){return 1;}
     public double b(double x,double y){return 1;}
    这个时候System.out.println(new B().b(3,3));调用会找有符合int类型的方法,
    这个时候会jvm会调用 public int b(int x,long y){return 1;}因为找到了匹配的int类型
     public double b(double x,double y){return 1;}因为上面那个方法更加精确就不会调用 这个了,优先级就低了
      

  4.   

    System.out.println(new B().b(3,3));根据你的写法根本无法抉择匹配的方法。故而出现那种编译错误,你需要使你的参数类型更加的明确,这也是函数重载需要注意的
      

  5.   


    因为上面的调用方法的时候两个数字都是int型的,而方法的参数里面有一个方法的第一个参数是int型的第二个参数是long第一个参数匹配,第二个参数也可以匹配,但不是最适合的,第二个方法的第一个参数是double型的匹配但不是最适合的,第二个参数是int型的匹配的,两个方法的优先级一样,所以就会报不明确的错误然而下面的:第一个参数是int型的第二个参数是long第一个参数匹配,第二个参数也可以匹配,但不是最适合的,第二个方法的第一个参数是double型的匹配但不是最适合的,第二个参数是double型的匹配但也不是最适合的,这个时候第一个方法的优先级比第二个方法的优先级! java虚拟机就会去调用第一个方法,而不会去调用第二个方法,楼主可以在第一个方法里面打印出一句话! 就知道是调用的第一个方法了!  祝楼主在java学习之旅中开开心心!  快快乐乐!!
      

  6.   

    第一段代码中的最后一句改成System.out.println(new B().b(3.3,3))或System.out.println(new B().b(3,3L))就没有问题了。所以说通不过编译不是因为重载写的不对,而是调用的参数问题,当你直接写b(3,3)时,其第一个参数int型可以通过自动类型转换为double型的而适配第2个,同样第2个参数也可以通过自动类型转换为long型,这时编译器就不知道要使用哪个方法了于是报错。而第二段代码由于是第2个b的参数是(double,double)的,当使用(3,3)的参数时将直接使用第一个b(int,long)。
      

  7.   

    首先为我3楼的发言道歉!
    其次,基本上的所有人的观点都是一个观点,就是说那个通不过的原因是因为都只匹配上了一个INT,然后下一个不知道匹配哪个才报错.public class B
    {
        public int b(long y){return 1;}
        public double b(double y){return 1;}
        public static void main(String[] args)
        {
      System.out.println(new B().b(3));
        }
    }为何能正常编译执行?照你们的思路,上面的是必定要报错的.
      

  8.   

    再来对比一下public class B 

        public int b(int x,long y){return 1;} 
        public double b(int x,double y){return 1;} 
        public static void main(String[] args) 
        { 
    System.out.println(new B().b(3,3)); 
        } 
    } 这段代码报错,而public class B
    {
        public int b(long y){return 1;}
        public double b(double y){return 1;}
        public static void main(String[] args)
        {
      System.out.println(new B().b(3));
        }
    }能正常编译?照你们的思路,上面的是必定也要报错的.
      

  9.   


    为什么会报错呢!如果找不到匹配的int,那会去找与int最接近的long会优先于double
      

  10.   

    double 和 long在匹配int时也应该有优先级吧   你可以在输出里看调用的是哪个方法。实践是检验真理的唯一方式,机器有机器的规则,这jvm不是我们设计的,只有顺着它来吧。
    ps:我不是学java的,只是现学现卖。
      

  11.   

     int b(int x,long y)    
     double b(int x,double y) 简单的说会把你给的参数统一转换类型去匹配你的方法new B().b(3,3),但是很不幸没有找到匹配的,注意,是统一转换,不会说 一个给你转int 一个给你转long 这样都匹配了
    但是当你
    double b(int x,double y)
    变成
    double b(double x,double y)的时候 统一都用double 转(3,3)就匹配了
    这是重载实现的原理,我理解的。。吼吼
    楼主参考下吧,不一定对用来研究这个例子还是挺有意思的,实际用还是要声明好类型就哦可了
      

  12.   

     8楼解释完全正确……public class Btl {
    public int b(int x, long y) {
    System.out.println("int");
    return 1;
    } public double b(double x, double y) {
    System.out.println("double");
    return 1;
    } public static void main(String[] args) {
    System.out.println(new Btl().b(3, 3));
    }
    }
    运行结果:
          int
         1
    希望大家手动下,就知道结果了。
      

  13.   

    8楼解释正确的话为什么
    public class B
    {
        public int b(long y){return 1;}
        public double b(double y){return 1;}
        public static void main(String[] args)
        {
         System.out.println(new B().b(3));
        }
    }
    不报错,但各加一个INT参数时,就报错了?所谓的优先级根本是错误的
    public class B 

        public int b(int x,long y){return 1;} 
        public double b(int x,double y){return 1;} 
        public static void main(String[] args) 
        { 
    System.out.println(new B().b(3,3)); 
        } 
    }这段报错
      

  14.   

    new Btl().b(3, 3)....  3 默认的为 int型的;  3能自动转换类型为 long 和double ;如果方法中有b(int x,int y)的话,肯定就调用这个了;
    没有的话,就要找能自动转换类型的了
    public int b(int x,long y){return 1;} 
    第一个参数是 int型的,所以不转换刚好符合; 第二个参数不是int 但都符合自动转换类型的条件,
    所以 可以调用这个方法
    public double b(int x,double y){return 1;} 
    第一个参数是 int型的,所以不转换刚好符合; 第二个参数不是int 但都符合自动转换类型的条件,
    所以 也可以调用这个方法
    方法调用不明确 ,不知道该调用哪个方法;所以错了public int b(int x,long y){return 1;} 
    第一个参数是 int型的,所以不转换刚好符合; 第二个参数不是int 但都符合自动转换类型的条件,
    所以 可以调用这个方法
    public double b(double x,double y){return 1;} 
    两个参数都 需要自动转换类型,也算符合条件吧;但相对于只用转换一个参数的,肯定不调用这个
      

  15.   

    是否mysql外键(这个特别类型的表 外键是自己表的主键 ) 不大支持高并发 ??
      

  16.   

    晕额、、 我怎么运行 两个程序都 能运行 成功啊.......int -> long -> double
    ....
    自动类型转换有个顺序有long 的就用 
    没有就再转double 的
    ....double参数放的前后 相关
      

  17.   

    这个是数据类型的问题
    如果两个都是 double
    类型   public int b(int x, long y) {
            System.out.println("int");
            return 1;
        }    public double b(double x, double y) {
            System.out.println("double");
            return 1;
        }    public static void main(String[] args) {
            System.out.println(new Btl().b(3, 3));
        }
    呵呵
      

  18.   

    public int b(int x,long y){return 1;}
    public double b(int x,double y){return 1;} 
    这个能运行成功;返回值肯定是 int 的那个了..public int b(int x,long y){return 1;}
    public double b(double x,int y){return 1;}
    这个运行不成功;
      

  19.   

    看了一大堆,都在谈如何修改方法,其实个人认为这个思路就错了,因为从类以及方法的定义来看都是没有任何问题的,调用出错的原因是jvm不知道应该去调用哪个方法而已。看看我修改的调用方式吧public class B {
    public int b(int x, long y) {
    return 1;
    } public double b(double x, int y) {
    return 1;
    } public static void main(String[] args) {
    System.out.println(new B().b(3.0, 3));
    System.out.println(new B().b(3, (long)3));
    }}