您的位置:首页 > 编程语言 > Java开发

java方法重载深层思考

2013-08-29 21:50 190 查看
import java.util.ArrayList;
import java.util.List;

public class Demo {
public static void main(String[] args) {
x(null);
}
public static void x(int x){
System.out.println("x(int)");
}
public static void x(List x){
System.out.println("x(List)");
}
public static void x(ArrayList x){
System.out.println("x(ArrayList)");
}
public static void x(Object x){
System.out.println("x(Object)");
}
}

先给段代码,大家认为会输出什么?

这个当然直接copy到编译器就直接知道了,是x(ArrayList)

那么为什么呢?

先说说重载的规则:

1.      java编译器在寻找最精确的匹配的方法,例如,max(3,4)调用的就是max(int ,int);max(3.0,4.0)调用的就是max(double,double);

2.      被重载的方法必须有不同的参数列表。不能基于不同修饰符或返回值类型来重载方法。例如public static int max(int num1,int num2)和private
static int max   (int num1,intnum2);

       public static double max(int num1,int num2)和public static int max(int num1,intnum2)

 

 有时候调用一个方法时,会有两个或更多匹配的,会造成歧义调用(ambitious invocation)的编译错误。即当编译器找不到最准确的匹配方法时便会出现这个情况,比如:

public class test{
public static void main(String[] args){
System.out.println(max(1,2));
}
public static int max(int num1,double num2){
if(num1>num2)
return num1;
else
return num2;
}
public static int max(double num1,int num2){
if(num1>num2)
return num1;
else
return num2;
}
}

 

 

 又比如,如果把这里

    public static void x(int x){

        System.out.println("x(int)");

    }

改成

    public static void x(Integer x){

        System.out.println("x(int)");

    }

程序就会报错!

因为匹配有错!Integer是引用类型,Integer对象是可以赋值为null的,这个就和List/ArrayList冲突了

在原来程序里面,int 是原生类型,Object是基本对象类型,所以,这两个和List \ ArrayList不冲突,所以,不会报错!

那么为什么List和ArrayList不冲突呢?

Object ---> List ---> ArrayList是继承关系。

在英语语法中,有一个有意思的原则,叫:就近原则 , Java的设计者在设计重载函数的冲在顺序时,不应该忽视他,因为这个原则很好的表达了继承关系。

于是,根据这原则,List和ArrayList不会冲突,并且在这个代码里面int无法赋值为null,所以自然选择x(ArrayList)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: