1. 程式人生 > >面向物件何為多型?

面向物件何為多型?

前言:面向物件程式設計過程中少不了

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);
		}
		
	}
	
	
	
	
}