概念:Java的多态性是指不同的类的实体可以对同一消息产生不同的回应,即同一消息会由于调用的对象不同而产生不同的行为方式。
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
实现多态的三个必要条件:继承、重写、向上转型。
下面来看一个例子:
class A {
public String show(D obj){ 方法一
return ("A and D");
}
public String show(A obj){ 方法二
return ("A and A");
}
}
class B extends A{
public String show(B obj){ 方法三
return ("B and B");
}
public String show(A obj){ 方法四
return ("B and A");
}
}
class C extends B{}
class D extends B{}
问以下的输出结果是什么
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); ①
System.out.println(a1.show(c)); ②
System.out.println(a1.show(d)); ③
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(b.show(b)); ⑦
System.out.println(b.show(c)); ⑧
System.out.println(b.show(d)); ⑨
答案:
① A and A
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D
想完全做对这道题目确实需要对多态理解的特别深刻,下面我进行讲解:
1、2、3中,是调用a1中的方法,a1为A类对象实例也是A,那么在a1中的可用的方法为一、二这俩个,参数分别为b、c、d由于b、c分别继承为A可将其视作A类型,故很简单输出分别为 A and A、A and A、A and D。
4、5、6中,a2对象是一个A类型的上转型对象,a2可用的方法为方法一、方法四,很多人会问为什么是方法四而不是方法二呢,这里就是多态性的体现,a2是A类型的所以a2只能使用A类的方法方法一,方法二,但同时a2给的是B类的实体,在B类中重载了方法二,故方法二被方法四覆盖了!这样看来就很容易判断最后的结果了,7 8 9 的输出亦是同样的道理。