天天看點

面向對象的特征之三:多态

1、多态性,可以了解為一個事物的多種表現形态

       1> 方法的多态性:重載與重寫

       2>子類對象的多态性:父子類對象的轉換

                       ①、父類的引用指向子類對象(即向上轉型),當調用方法時,實際上執行的是子類重寫父類已有的方法。

                           格式:父類 父類對象 = 子類執行個體

class Man extends Person{
	Person p1 = new Man();
	p1.eat();
	p1.walk();
}           

                           ②、子類的引用指向父類對象(即向下轉型),使用強轉符(),父類對象變為子類對象。

                                (作用:子類擴充了父類的屬性和方法,彌補向上轉型時,子類特有屬性、方法丢失的問題) 

                                      格式:子類 子類對象 = (子類)父類執行個體;

class Man extends Person{
	Person p1 = new Man();
	Man m = (Man)p1;
    m.smoking();
}           

2、子類對象的多态性使用的前提:①要有類的繼承②要有子類對父類方法的覆寫。

3、程式運作分為編譯和運作狀态。

         對于多态性來說,編譯時,“看左面”,将此引用變量了解為父類的類型

         運作時,“看右面”,關注真正對象的實體:子類的對象。

4、子類對象的多态性,并不适用于屬性。

多态具體使用如下執行個體所示:

package com.hdu.java;

public class TestPeople {
	public static void main(String[] args) {
		TestPeople tp = new TestPeople();
		tp.fun(new People());
		tp.fun(new Man());
		tp.fun(new Woman());
		
	}
	public void fun(People p) {
		p.eat();
		p.sleep();
		if(p instanceof Man) {
			Man m = (Man)p;
			m.smoking();
			}else if(p instanceof Woman) {
				Woman w = (Woman)p;
				w.shopping();
			}
		
	}

}
class People{
	public void sleep() {
		System.out.println("人睡覺");
	}
	public void eat() {
		System.out.println("人吃飯");
	}
}
class Man extends People{
	public void sleep() {
		System.out.println("男人粗魯地睡覺");
	}
	public void eat() {
		System.out.println("男人大口吃飯");
	}
	public void smoking() {
		System.out.println("男人怎能不抽煙!");
	}
}
class Woman extends People{
	public void sleep() {
		System.out.println("女人孤獨地睡覺");
	}
	public void eat() {
		System.out.println("女人小心翼翼地吃飯");
	}
	public void shopping() {
		System.out.println("女人如何不購物!");
	}
}

程式運作結果:
人吃飯
人睡覺
男人大口吃飯
男人粗魯地睡覺
男人怎能不抽煙!
女人小心翼翼地吃飯
女人孤獨地睡覺
女人如何不購物!
           

繼續閱讀