java中的對於多型的理解
阿新 • • 發佈:2018-12-31
面向物件:
類:具體的物件抽象而來,可以抽象的表示一類具有相同特徵和行為的物件
物件:是由類的例項化而來,物件是類的一個例項
java中關於多型的理解
打個比方 父親person有行為這個方法,裡面包括幾個動作:吃飯,睡覺,走路 父親有三個兒子,三個兒子都繼承了父親的行為方法,所以三個兒子都有吃飯,睡覺,走路這些動作,但是三個兒子又分別有自己的動作--大兒子A會彈吉他,二兒子B會唱歌,三兒子C會打鼓 ...
1.Person person = new A(); 不是父類物件指向子類引用而是父類引用指向子類物件
2.這個物件不能呼叫子類A特有的彈吉他方法--person.guitar(); X
3.如果僅是這麼寫程式,還不是多型,記住實現多型的三要素:繼承 重寫 父類引用指向子類物件
4.之後,如果你呼叫persion.guitar(),此時在程式碼的編譯階段,persion呼叫的仍然是自己的guitar(),不是兒子的。而當程式執行時,就是java XXX, persion呼叫的卻是兒子的guitar()。這個動態的過程才是多型 。
Java中,父類的引用既可以指向父類的物件,也可以指向子類的物件。但子類的引用不能指向父類的物件。 引用型別也可以進行型別轉換。 但轉換的型別一定具有繼承關係,即僅允許父子類之間進行轉換。 如果嘗試將毫無關聯的兩個型別進行轉換,將會引發編譯錯誤。可以使用instanceof來判斷引用是否為指定的型別。Person person; //父類的引用指向子類的方法; person = new Student(); //person型別引用做一個判斷 //(1)if(person.eat().size==2 ) { if(person instanceof Person) { person.eat(); }else if(person instanceof Student) { Student stu = (Student)person; stu.eat(); } person.eat();//從程式碼角度看,此時是父類的引用呼叫的是父類中的eat方法 //(2)子類若覆蓋了父類的方法,eat動態繫結到父類的引用Person上,換個名字叫動態繫結 //父類的引用可以呼叫子類的方法,我們把這一現象成為多型 //從字面意思來理解person這個父類的引用一會是person一會是student //person有多種狀態; //也叫方法的動態繫結 //繼承是通向多型的入口 person.f2(); person.gotobed(); person.eat(); Student stu = new Student(); stu.eat(); stu.gotobed(); //父類的引用能夠呼叫子類的方法 }