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("女人如何不購物!");
}
}
程式運作結果:
人吃飯
人睡覺
男人大口吃飯
男人粗魯地睡覺
男人怎能不抽煙!
女人小心翼翼地吃飯
女人孤獨地睡覺
女人如何不購物!