1. 程式人生 > >java中的對於多型的理解

java中的對於多型的理解

面向物件:      類:具體的物件抽象而來,可以抽象的表示一類具有相同特徵和行為的物件      物件:是由類的例項化而來,物件是類的一個例項 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()。這個動態的過程才是多型 。
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();
           //父類的引用能夠呼叫子類的方法
	}
Java中,父類的引用既可以指向父類的物件,也可以指向子類的物件。但子類的引用不能指向父類的物件。 引用型別也可以進行型別轉換。 但轉換的型別一定具有繼承關係,即僅允許父子類之間進行轉換。 如果嘗試將毫無關聯的兩個型別進行轉換,將會引發編譯錯誤。可以使用instanceof來判斷引用是否為指定的型別。