读书人

Java多态性的一个事例

发布时间: 2012-11-01 11:11:32 作者: rapoo

Java多态性的一个例子
直接上代码吧:
1.test.java

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 ASystem.out.println(a1.clarify(c)); // A and ASystem.out.println(a1.clarify(d)); // A and DSystem.out.println(a2.clarify(b)); // B and ASystem.out.println(a2.clarify(c)); // B and ASystem.out.println(a2.clarify(d)); // A and DSystem.out.println(b.clarify(b)); // B and BSystem.out.println(b.clarify(c)); // B and BSystem.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{}
1 楼 mqlfly2008 2010-07-13 看完了这个,自己试验了下才明白在说什么!

感觉如果用文字表达可能会更加的清晰


在此添加上自己的理解!

在泛型中!首先会寻找对象被定义时被定义的索引A a = new B() ;

a 就被被定义为 类A的一个对象

所以在寻找方法的时候会先去找参数的最小泛型(可能会是子类类型本身),如果 A 类中

没有找到该方法,就会去A 的父类中寻找!这个是泛型的向上;如果父类中也没有,就会尝

试向上泛型参数!如果在A中有适应的方法,则会去看看a对象的真实引用B中是否覆盖了A

中的这个方法,如果覆盖了,则会调用子类B中覆盖父类的方法











读书人网 >其他相关

热点推荐