package cn.com;
public class test
{
public static void main(String[] args)
{
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
// 优先级由高到低依次为:
// the.clarify(O)、super.clarify(O)、the.clarify((super)O)、super.clarify((super)O)
//
// a2.clarify(b),a2是一个引用变量,类别为A,则the为a2,
// b是B的一个的举例,于是它到类A里面找clarify(B obj),没有找到,
// 于是到A的super(超类)找,而A没有超类,因此转到第三优先级the.clarify((super)O),
// the仍然是a2,那里O为B,(super)O即(super)B即A,因此它到类A里面找clarify(A obj),
// 类A有那个窍门,但是由于a2引用的是类B的一个的对象,B覆盖了A的clarify(A
// obj)窍门,因此最终锁定到类B的clarify(A obj),输出为"B and A”
System.out.println(a1.clarify(b)); // A and A
System.out.println(a1.clarify(c)); // A and A
System.out.println(a1.clarify(d)); // A and D
System.out.println(a2.clarify(b)); // B and A
System.out.println(a2.clarify(c)); // B and A
System.out.println(a2.clarify(d)); // A and D
System.out.println(b.clarify(b)); // B and B
System.out.println(b.clarify(c)); // B and B
System.out.println(b.clarify(d)); // A and D
}
}
2.A.java
package cn.com;
class A
{
public String clarify(D obj)
{
return ("A and D");
}
public String clarify(A obj)
{
return("A and A");
}
}
3.B.java
package cn.com;
class B extends A
{
public String clarify(B obj)
{
return ("B and B");
}
public String clarify(A obj)
{
return ("B and A");
}
}
4.C.java
package cn.com;
class C extends B
{
}
5.D.java
package cn.com;
class D extends B
{
}
分享到:
2010-07-04 17:41
浏览 2816
分类:非技术
评论
1 楼
mqlfly2008
2010-07-13
看完了这个,自己试验了下才明白在说什么!
感觉如果用文字表达可能会更加的清晰
在此添加上自己的理解!
在泛型中!首先会寻找对象被定义时被定义的索引A a = new B() ;
a 就被被定义为 类A的一个对象
所以在寻找方法的时候会先去找参数的最小泛型(可能会是子类类型本身),如果 A 类中
没有找到该方法,就会去A 的父类中寻找!这个是泛型的向上;如果父类中也没有,就会尝
试向上泛型参数!如果在A中有适应的方法,则会去看看a对象的真实引用B中是否覆盖了A
中的这个方法,如果覆盖了,则会调用子类B中覆盖父类的方法