public class CollectionDemo { public static void main(String[] args){
p(null); }
static void p(Object o){
System.out.println("001");
}
static void p(String s){
System.out.println("002");
}
}求结果,如果在后面再加上一个
static void p(StringBuffer sb){
System.out.println("003");
}求结果。 大家都可以想一下,再去运行一下结果,看看是否一致。当然了,最重要的,还是听听大家对其运行的分析。
p(null); }
static void p(Object o){
System.out.println("001");
}
static void p(String s){
System.out.println("002");
}
}求结果,如果在后面再加上一个
static void p(StringBuffer sb){
System.out.println("003");
}求结果。 大家都可以想一下,再去运行一下结果,看看是否一致。当然了,最重要的,还是听听大家对其运行的分析。
p(Obj) 和 p(Strbuf) 可以一起出现,因为strbuf不是final修饰的。 结果为 003具体什么原因 期待高手~~~~
static void p(String s){
System.out.println("002");
}
} static void p(StringBuffer sb){
System.out.println("003");
} ,如果出现这种情况,那会执行非Object类型的
p(null)就报错呢
等高人解释
只要重名的方法中的参数的类型有一个是final类的
那么其他重名的方法参数类型有除了Object类型和fianal类的父类类型外
p(null)就会编译报错,这是为什么呢
当调用p(null)编译器会去检查所有p()方法的参数
除非各个重名方法的参数中存在上下级关系,否则都视为Object
就像StringBuffer 和 String编译器把它们当作两个Object了所以编译报错
方法执行的优先级是从参数是子类(最下界?)开始的
等待达人解释
有兴趣的可以到百度这个地址看看:http://zhidao.baidu.com/question/73578464.html
当然你也可以加入下面代码是:static void p(int a){
System.out.println("111");
}
static void p(char c){
System.out.println("111");
}
}
class Sub extends Base{
}
public class Overload{
public static void main(String[] args){
p(null);
}
static void p(Object o){
System.out.println("001");
}
static void p(Base base){
System.out.println("002");
}
static void p(Sub sub){
System.out.println("003");
}
} 也就是说如果多个方法的参数类型都能匹配的话,编译器最终会选择一个“最具体”的方法。所谓一个方法A比另外一个方法B更加具体意思是:任何传递到A方法的参数都可以被方法B接受。
在这里任何传递给 p(Sub sub)的方法都可以被p(Base base)接受,因此p(Sub sub)更具体。
大概是这个意思,忘了在哪里看过了.....
这个 原理不难,编译很聪明 它会找最近视object的类型 来匹配
所以 这里它 找到了
static void p(String s){
System.out.println("002");
} 但是你在加一个 static void p(StringBuffer sb){
System.out.println("003");
} 编译器很无奈 因为他们认为 这2种都很接近object,所以 存在二义性,编译是过不去的over
引自--java puzzlers,Puzzle 46: The Case of the Confusing Constructor
p(String s)
这两个一起出现没有问题,String是Object的子类.
它会调用 String而不是Object
如果加一个p(StringBuffer sb)
就会弄不懂要调用 哪个,StrinbBuffer也是Object的
子类,它的String这两个方法不能确定是调用哪个.
如果不调用,p(null)是可以编译通过的.
package aa;import java.util.List;public class Bb { public static void main(String[] args){
p(null); } static void p(Object o){
System.out.println("001");
}
static void p(Ccc sb){
System.out.println("002");
}
static void p(Ddd sb){
System.out.println("003");
}
static void p(int sb){
System.out.println("004");
}
}class Ccc extends Object{
}class Ddd extends Ccc{
}
打印结果003boolean judge = null instanceof Object;
if(judge){
System.out.println("Yes, null is an Object.");
}else{
System.out.println("No, null is an Object.");
}------- 编译/运行结果 -------No, null is an Object.
///:~End of Code segment 3
综上所述,java中的null 的类型是<nulltype>.null本身不是Object
这里null在传输的过程中会自动转换成Object
楼主的问题上第一次打印002是因为null在选择方法上的优先级,选择最小的。
加上后面的代码报错是因为null只能选择一个同级的Object类型,同时有多个同级类型就会不知道选择那个。所以编译报错。