说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

scjp题又一问题

编辑:说三道四文库 发布时间:2018-05-21 01:41
HTML文档下载 WORD文档下载 PDF文档下载
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.method(null); 
    }
  }


1.   public class Test {

 2.     public void method(StringBuffer sb) { 
 3.       System.out.println("StringBuffer Verion"); 
 4.     }

 5.     public void method(String s) { 
 6.       System.out.println("String Version"); 
 7.     }

 8.     public static void main(String args[]) { 
 9.       Test test = new Test(); 
 10.      test.method(null); 
 11.    }
 12.  }

为什么第一个就可以输出"String Version"而第二个不可以呢?
首先

java.lang.Object是顶级的类

java.lang.String和java.lang.StringBuffer都是Object的子类

而且String和StringBuffer是同级的
null可是任意对象类型的,所以JVM可以认为它是String类型的,也可以是StringBuffer类型的,这时就产生了二义性错误!
在重载方法中参数有可能混淆的情况下,编译器使用下面的策略:
1. 如果发生混淆的位置上的所有参数类型在继承关系上构成一棵有分支的树,报错。
2. 如果这些参数类型在继承关系上是一个队列,匹配类体系中最低级的那个。

程序:
public class InheritanceTest
{
public class C_1 extends Object {}

public class C_1_1 extends C_1 {}
public class C_1_2 extends C_1 {}

public class C_1_1_1 extends C_1_1 {}
public class C_1_1_2 extends C_1_1 {}
public class C_1_2_1 extends C_1_2 {}

public void pr( C_1 c )
{
System.out.println( "C_1" );
}

public void pr( C_1_1 c )
{
System.out.println( "C_1_1" );
}

public void pr( C_1_1_1 c )
{
System.out.println( "C_1_1_1" );
}

//报错
public void pr( C_1_2_1 c )
{
System.out.println( "C_1_2_1" );
}

public static void main( String args[] )
{
InheritanceTest t = new InheritanceTest();
t.pr( null );
}
}
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘