public class overloading {
public static void print(String i){
System.out.println("String i");
}
public static void print(Object o){
System.out.println("object o");
}
/*public static void print(Buffer b){
System.out.println("buffer b");
}*/
}
public class testloading {
public static void main(String[] args) {
// TODO Auto-generated method stub
overloading.print(null);
}
}
当屏蔽print(Buffer b)时,testloading类可以通过编译,可添加print(Buffer b)方法后,testloading类不能通过编译了,为什么,能详解吗?谢谢
[b]问题补充:[/b]
我想zhangyou1010、Heart.X.Raid所说的应该是null没有具体对象,JVM无法指定调用哪个方法,对吗?
可是当只有print(String i)和print(Object o)这两个方法(用任何类型对象替换String参数一样)时,能够通过编译,JVM会调用print(String i)方法。
只有print(String i)和print(Object o)这两个方法(用任何类型对象替换String参数一样)时,能够通过编译的问题解释:
因为所有对象 都是默认继承处Object对象啊,
自然就先定位子类string嘛
Buffer类没有定义.
会报:
The method print(String) is ambiguous for the type Overloading
如果是重载的话,传入的值应该是动态的,值是不确定的。
overloading.print(null); 这里估计编译器识别不错null是哪个类型。
如果这样: String a = null ;
overloading.print(a);
就可以避免了。我想工作中也应该是这样处理的。也就是说穿给print方法的参数类型应该是可以确定的。
你搞得有问题自己了
overloading.print(null); 你把null当参数 传递,自然可以匹配多个重载的方法
对于null而言,JVM把它当成一个对象。但是JVM并没有为这个null对象指定任何实际的值,而是留给每一种实现者自行决定。
所以你可以 String i=null;
也可以 Object o=null; Buffer b=null;等
所有的类类型的对象都可以指向null。这样就会出现调用重载的方法时匹配到多个合适的方法。