對象的多種形態(tài)
1.引用形態(tài)
父類的引用可以指向本類的對象
父類的引用可以指向子類的對象
Animal d=new Animal();
Animal d2=new Dog(); //父類變量不能引用子類的對象
但是Dog d2=new Animal();就是錯(cuò)的 子類變量不能引用父類的對象
2.方法多態(tài)
創(chuàng)建本類對象時(shí),調(diào)用的方法為本類方法
創(chuàng)建子類對象時(shí),調(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();// 這是不行的 ,因?yàn)閣atchdoor是子類專有的方法
d3.eat();//雖然d3 cat類里面什么也沒有,但是因?yàn)槎鄳B(tài)的原因 它會(huì)調(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實(shí)例,調(diào)用show(B b)方法,此方法在父類A中沒有定義,所以B中方法show(B b)不會(huì)調(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)時(shí),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