public class test1 { public test1() { } } public class test2 extends test1 { public test2() { } } public class test {public void method(Object o) { System.out.println("Object Version"); } public void method(test1 s) { System.out.println("test1 Version"); }public void method(test2 s) { System.out.println("test2 Version"); } /*public void method(String a){ System.out.println("String version"); }*/ public static void main(String args[]) { test test = new test(); test.method(null); } } 你们可以试试,这段程序,然后把注释去掉,看看又会怎么样。
1、修改了测试程序: // test.java import java.util.*;public class test { public void method(Object o) { System.out.println("Object Version"); } public void method(String s) { System.out.println("String Version"); } public static void main(String args[]) { test test = new test(); test[] t=new test[1]; test.method(new Integer(1)); if(t[0]==null){ System.out.println("Here is null"); test.method(t[0]); } test.method(null); } } 2、结果如下: F:\java>java test Object Version Here is null Object Version String Version 3、问题确实有些奇怪: 同样t[0]也是null,输出结果是“Object Version”
解释一下为什么说“具体”不好,因为具体相对于抽象,在我的例子中test1是test2的超类但不好说test1是抽象的吧,所以我觉得找“最新”的匹配比较合适,不过我知道其实我们的理解是一样的,呵呵 楼上这个例子也说明这一点。因为t[0]是test类型的对象在找不到最新的test类型的对象匹配时所以调object 的方法,不信可以试试加个 public void method(test a) { System.out.println("test version"); } 方法。
public void method(Object o) {
System.out.println("Object Version");
}
System.out.println("Object Version");
}
}
}
public class test2 extends test1 { public test2() {
}
}
public class test {public void method(Object o) {
System.out.println("Object Version");
}
public void method(test1 s) {
System.out.println("test1 Version");
}public void method(test2 s) {
System.out.println("test2 Version");
}
/*public void method(String a){
System.out.println("String version");
}*/
public static void main(String args[]) {
test test = new test();
test.method(null);
}
}
你们可以试试,这段程序,然后把注释去掉,看看又会怎么样。
// test.java
import java.util.*;public class test {
public void method(Object o) {
System.out.println("Object Version");
} public void method(String s) {
System.out.println("String Version");
} public static void main(String args[]) {
test test = new test();
test[] t=new test[1];
test.method(new Integer(1)); if(t[0]==null){
System.out.println("Here is null");
test.method(t[0]);
}
test.method(null);
}
} 2、结果如下:
F:\java>java test
Object Version
Here is null
Object Version
String Version
3、问题确实有些奇怪:
同样t[0]也是null,输出结果是“Object Version”
楼上这个例子也说明这一点。因为t[0]是test类型的对象在找不到最新的test类型的对象匹配时所以调object 的方法,不信可以试试加个
public void method(test a)
{
System.out.println("test version");
}
方法。
比如一个为String
另一个为Frame类,又调用哪一个呢?
animal(){
System.out.println("I am an animal");
}
}class bull extends animal{
bull(){
System.out.println("I am a bull");
}
}class fruit {
fruit(){
System.out.println("I am a fruit");
}
}class apple extends fruit{
apple(){
System.out.println("I am a apple");
}
}public class testnull{
/*void Method(animal a){
System.out.println("animal version");
}*/
/*void Method(bull b){
System.out.println("bull version");
}*/
void Method(fruit f){
System.out.println("fruit version");
}
void Method(apple a){
System.out.println("apple version");
}
void Method(Object o){
System.out.println("Object version");
}
/*void Method(String s){
System.out.println("String version");
}*/
public static void main(String[] args){
testnull t=new testnull();
//出现编译错误:
//F:\java>javac testnull.java
//testnull.java:48: reference to Method is ambiguous, both method Method(bull) in
//testnull and method Method(java.lang.String) in testnull match
// t.Method(null);
// ^
//1 error
//在测试如下几种组合后会出现类似的错误信息:
//1、注释Mothod(String s)
//2、注释Mothod(String s)、Method(bull b)
//在测试以下组合后,编译成功,输出结果为“apple version”:
//1、注释Mothod(String s)、Method(bull b)、Method(animal a)
//猜想:
//对于输入参数直接为null的情况:
//1、当所有重载方法的参数类型不都属于一类时,会出现编译错误。
// 当然Object可以属于任何一个子类,故Object可以属于animal、bull、fruit、apple、String
//2、当所有重载方法的参数类型都属于一类时,会调用参数是类树中最高级的行为。
// 如上述的成功组合,输出结果是apple,不是fruit、Objcet
//3、事实上,这种输入参数直接为null的情况的实际意义不大。
t.Method(null);
}
}
animal(){
System.out.println("I am an animal");
}
}class bull extends animal{
bull(){
System.out.println("I am a bull");
}
}class fruit {
fruit(){
System.out.println("I am a fruit");
}
}class apple extends fruit{
apple(){
System.out.println("I am a apple");
}
}public class testnullnew{
void Method(animal a){
System.out.println("animal version");
}
void Method(bull b){
System.out.println("bull version");
}
void Method(fruit f){
System.out.println("fruit version");
}
void Method(apple a){
System.out.println("apple version");
}
void Method(Object o){
System.out.println("Object version");
}
void Method(String s){
System.out.println("String version");
}
public static void main(String[] args){
testnullnew t=new testnullnew();
//猜想:
//对于行为参数不直接为null的情况:
//1、调用那个参数和输入参数最匹配的行为
testnullnew[] tarr=new testnullnew[1];
t.Method(tarr[0]);//输出Object version
bull[] barr=new bull[1];
t.Method(barr[0]);//输出bull version
}
}