對象的多種形態(tài)
1.引用形態(tài)
父類的引用可以指向本類的對象
父類的引用可以指向子類的對象
Animal d=new Animal();
Animal d2=new Dog();? //父類變量不能引用子類的對象
但是Dog?d2=new Animal();就是錯的 ?子類變量不能引用父類的對象
2.方法多態(tài)
創(chuàng)建本類對象時贸营,調(diào)用的方法為本類方法
創(chuàng)建子類對象時,調(diào)用的方法為子類重寫的方法或者繼承的方法
public class Cat extends Animal {
}
public class Initial {
public static void main(String[] args) {
Animal d=new Animal();
Animal d2=new Dog();
Animal d3=new Cat();
d.eat();
d3.watchddor();// 這是不行的 ?膘魄,因為watchdoor是子類專有的方法?
d3.eat()婶溯;//雖然d3 cat類里面什么也沒有疏唾,但是因為多態(tài)的原因 它會調(diào)用父類的方法
}
}
```
publicclassA{
publicStringshow(D obj){
return("A and D");
? ? ? ? }?
publicStringshow(A obj){
return("A and A");
? ? ? ? }?
? ? }?
publicclassBextendsA{
publicStringshow(B obj){
return("B and B");
? ? ? ? }?
publicStringshow(A obj){
return("B and A");
? ? ? ? }?
? ? }?
publicclassCextendsB{
? ? }?
publicclassDextendsB{
? ? }?
publicclassTest{
publicstaticvoidmain(String[] args){
A a1 =newA();
A a2 =newB();
B b =newB();
C c =newC();
D d =newD();
System.out.println("1--"+ a1.show(b));
System.out.println("2--"+ a1.show(c));
System.out.println("3--"+ a1.show(d));
System.out.println("4--"+ a2.show(b));//4--B and A .首先a2是A引用,B實例,調(diào)用show(B b)方法砂代,此方法在父類A中沒有定義惜互,所以B中方法show(B b)不會調(diào)用(多態(tài)必須父類中已定義該方法)布讹,再按優(yōu)先級為:this.show(O)科侈、super.show(O)、this.show((super)O)炒事、super.show((super)O)臀栈,即先查this對象的父類,沒有重頭再查參數(shù)的父類挠乳。查找super.show((super)O)時权薯,B中沒有,再向上睡扬,找到A中show(A a),因此執(zhí)行盟蚣。
System.out.println("5--"+ a2.show(c));//同上
System.out.println("6--"+ a2.show(d));//A and D .查找B中沒有show(D d)方法,再查A中卖怜,有屎开,執(zhí)行。
System.out.println("7--"+ b.show(b));
System.out.println("8--"+ b.show(c));//B and B .
System.out.println("9--"+ b.show(d));
? ? ? ? }?
? ? }
```
```
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
```