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
{
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
{
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了,
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)
很显然第一个Class B 不符合条件,编译不通过。
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;}因为上面那个方法更加精确就不会调用 这个了,优先级就低了
因为上面的调用方法的时候两个数字都是int型的,而方法的参数里面有一个方法的第一个参数是int型的第二个参数是long第一个参数匹配,第二个参数也可以匹配,但不是最适合的,第二个方法的第一个参数是double型的匹配但不是最适合的,第二个参数是int型的匹配的,两个方法的优先级一样,所以就会报不明确的错误然而下面的:第一个参数是int型的第二个参数是long第一个参数匹配,第二个参数也可以匹配,但不是最适合的,第二个方法的第一个参数是double型的匹配但不是最适合的,第二个参数是double型的匹配但也不是最适合的,这个时候第一个方法的优先级比第二个方法的优先级! java虚拟机就会去调用第一个方法,而不会去调用第二个方法,楼主可以在第一个方法里面打印出一句话! 就知道是调用的第一个方法了! 祝楼主在java学习之旅中开开心心! 快快乐乐!!
其次,基本上的所有人的观点都是一个观点,就是说那个通不过的原因是因为都只匹配上了一个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));
}
}为何能正常编译执行?照你们的思路,上面的是必定要报错的.
{
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));
}
}能正常编译?照你们的思路,上面的是必定也要报错的.
为什么会报错呢!如果找不到匹配的int,那会去找与int最接近的long会优先于double
ps:我不是学java的,只是现学现卖。
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)就匹配了
这是重载实现的原理,我理解的。。吼吼
楼主参考下吧,不一定对用来研究这个例子还是挺有意思的,实际用还是要声明好类型就哦可了
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
希望大家手动下,就知道结果了。
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));
}
}这段报错
没有的话,就要找能自动转换类型的了
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;}
两个参数都 需要自动转换类型,也算符合条件吧;但相对于只用转换一个参数的,肯定不调用这个
....
自动类型转换有个顺序有long 的就用
没有就再转double 的
....double参数放的前后 相关
如果两个都是 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));
}
呵呵
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;}
这个运行不成功;
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));
}}