当前位置: 技术问答>java相关
第一次遇到这个“简单”的继承问题,疑惑疑惑疑惑啊
来源: 互联网 发布时间:2015-03-07
本文导语: 请看下面这个程序,特别注意被注释掉的那行代码 class Tester { void test(Object s) { System.out.println ("Object version"); } void test(Tester s) { System.out.println ("Tester version"); } void test(SubTest...
请看下面这个程序,特别注意被注释掉的那行代码
class Tester
{
void test(Object s)
{
System.out.println ("Object version");
}
void test(Tester s)
{
System.out.println ("Tester version");
}
void test(SubTester s)
{
System.out.println ("SubTester version");
}
// void test(String s){System.out.println("String version");}
public static void main (String args[])
{
Tester c = new Tester();
c.test (null);
c.test (new Object());
}
}
class SubTester extends Tester{}
运行结果:
SubTester version
Object version
疑问:
1.第一次看到null也可以做为参数传递,那么c.test(null)到底指向哪个对应的test()方法啊?
2.那行被注释掉的语句看到了吗?如果把注释去掉,那么整个程序编译就无法通过:错误信息很简单,就一句:一个错误在c.test(null);
3. 这道题用到了哪些知识点啊?
class Tester
{
void test(Object s)
{
System.out.println ("Object version");
}
void test(Tester s)
{
System.out.println ("Tester version");
}
void test(SubTester s)
{
System.out.println ("SubTester version");
}
// void test(String s){System.out.println("String version");}
public static void main (String args[])
{
Tester c = new Tester();
c.test (null);
c.test (new Object());
}
}
class SubTester extends Tester{}
运行结果:
SubTester version
Object version
疑问:
1.第一次看到null也可以做为参数传递,那么c.test(null)到底指向哪个对应的test()方法啊?
2.那行被注释掉的语句看到了吗?如果把注释去掉,那么整个程序编译就无法通过:错误信息很简单,就一句:一个错误在c.test(null);
3. 这道题用到了哪些知识点啊?
|
不完整。
在重载方法中参数有可能混淆的情况下,编译器使用下面的策略:
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 );
}
}
|
译文:方法定义得越详细,即第一个方法的参数可以用来调用第2个方法而不引起便宜时错误,则带有null的方法调用将调用第一个方法。
解释清楚了吗?
解释清楚了吗?
|
我们知道,在java里类都是引用类型,null就是空引用类型,它可以代表任何类(只不过它是空的)。在做匹配时,根据面向对象的基本原理,应该找一个与他最匹配的参数,即:
A
A
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。