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)。
相关文章推荐
- java方法重载原理,案例说明
- JAVA_SE基础——17.方法的重载
- JAVA学习第五天--方法/重载
- java方法的重载与重写
- 关于java编程思想的学习之方法重载
- Java中的方法的重写与重载
- java 的方法重载overload
- Java的方法重载
- Java面向对象-方法的重载
- Java方法的重载以及构造函数的理解
- Java方法继承、方法重载、方法覆盖小总结
- Java 构造器 一道构造器调用子类重载方法的题目
- JAVA方法重载
- java 方法重载
- Java学习之方法重载
- java中方法的重载
- Java 使用方法重载实现给函数设定默认值
- JAVA总结之方法重载
- java学习中重写与重载方法的区别(转自:小鸟的天空)
- Java方法继承、方法重载、方法覆盖小总结