当前位置: 技术问答>java相关
scjp题又一问题
来源: 互联网 发布时间:2015-05-27
本文导语: 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...
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"而第二个不可以呢?
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"而第二个不可以呢?
|
在重载方法中参数有可能混淆的情况下,编译器使用下面的策略:
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 );
}
}
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 );
}
}
|
首先
java.lang.Object是顶级的类
java.lang.String和java.lang.StringBuffer都是Object的子类
而且String和StringBuffer是同级的
java.lang.Object是顶级的类
java.lang.String和java.lang.StringBuffer都是Object的子类
而且String和StringBuffer是同级的
|
null可是任意对象类型的,所以JVM可以认为它是String类型的,也可以是StringBuffer类型的,这时就产生了二义性错误!