面向物件何為多型?
阿新 • • 發佈:2018-12-18
前言:面向物件程式設計過程中少不了
1、封裝
2、繼承
3、多型
三個特性,其中多型又是怎麼理解的呢?
擯棄教科書式回答,多型語義是多種形態的縮寫,在面向物件程式設計的思想中,“萬物皆物件”,那麼我們知道,物件的行為和屬性由模板類定義,而通過模板類(class or interface)我們可以控制物件在runtime的行為屬性切換,這就是多型。
exam: 人,在家是孩子,在校是學生,長大了以後可能要當父母,或者是爺爺奶奶。。。。以此類推,同一個物件在不同時刻他們的屬性行為不同的概念就是多型,多型可以用子類向上轉型實現,也可以用介面實現。
程式碼實現,篇幅略長,最重要的是main方法的物件例項過程和呼叫過程,以及class和interface之間的關係。
package test; public class Test { public static void main(String args[]) { //定義一個學生 IStudent stu; //定義一個老師 ITeacher tea; //例項化一個人 Person person = new Test().new Person(); person.setName("張三"); //多型實現,這個人,可以是多種狀態(身份), //在家是孩子,在校是學生,或者是老師 //在老教師的面前還是學生,學無止境 stu = person; tea = person; stu.learn("英語"); tea.teach("英語"); //切換社會身份,普通人生活的步驟 person.eat("米飯"); person.sleep(7); person.excrete("流汗"); } /*學生介面定義*/ interface IStudent{ void learn(String subject); void exam(String subject); } /*老師介面定義*/ interface ITeacher{ void teach(String subject); } /*人類高階抽象的介面定義*/ interface IPerson{ //吃 void eat(String food); //睡 void sleep(int time); //思 void think(String question); //說 void say(String msg); //走 void run(int speed); //排洩 void excrete(String type); //交配 void mating(IPerson person); } /*人的初級抽象,人有男女之分,以生殖器型別為條件*/ abstract class PersonImpl implements IPerson{ //各種動態屬性 private String name; private String sex; private int age; private float height; private float weight; private String colour; @Override public void eat(String food) { // TODO Auto-generated method stub System.out.println("吃" + food); } @Override public void sleep(int time) { // TODO Auto-generated method stub System.out.println("睡了" + time + "小時"); } @Override public void think(String question) { // TODO Auto-generated method stub System.out.println("思考問題: " + question); } @Override public void say(String msg) { // TODO Auto-generated method stub System.out.println(msg); } @Override public void run(int speed) { // TODO Auto-generated method stub System.out.println("行走中,速度: " + speed); } @Override public void excrete(String type) { // TODO Auto-generated method stub System.out.println("排洩中: " + type); } @Override public void mating(IPerson person) { // TODO Auto-generated method stub System.out.println("交配中......"); person.mating(this); } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getHeight() { return height; } public void setHeight(float height) { this.height = height; } public float getWeight() { return weight; } public void setWeight(float weight) { this.weight = weight; } public String getColour() { return colour; } public void setColour(String colour) { this.colour = colour; } public String getName() { return name; } public void setName(String name) { this.name = name; } } /*人的具體實現*/ class Person extends PersonImpl implements IStudent, ITeacher{ @Override public void teach(String subject) { // TODO Auto-generated method stub System.out.println("正在教導科目: " + subject); } @Override public void learn(String subject) { // TODO Auto-generated method stub System.out.println("正在學習科目: " + subject); } @Override public void exam(String subject) { // TODO Auto-generated method stub System.out.println("正在測試科目: " + subject); } } }