java方法重载深层思考

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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值