JAVA多態知識

1.多態的概念:同一個對象在不同時刻體現出來的不同狀態。

2.多態的前提:

    A:有繼承或者實現關係。

    B:有方法的重寫。(如果沒有重寫,使用多態就沒有意義)

    C:有父類或父接口引用指向子類對象。

3.多態的分類

    A:具體類多態

class Father{}
class Son extends Father{}
Father f=new Son();

    B:抽象類多態

abstract class Father {}
class Son extends Father {}
Father f = new Son();

    C:接口多態

interface Father {}
class Son implements Father {}
Father f = new Son();

4.多態中成員訪問特點

    A:成員變量

        編譯時看父類,運行看父類

    B:構造方法

       子類構造默認訪問父類構造

    C:成員方法

        編譯時看父類,運行時看子類

    D:靜態方法

        編譯時看父類,運行看父類

    例:

class Father {
	public int num = 100;

	public void show() {
		System.out.println("show Father");
	}
	
	public static void function() {
		System.out.println("function Father");
	}
}

class Son extends Father {
	public int num = 1000;
	public int num2 = 200;

	public void show() {
		System.out.println("show Son");
	}
	
	public void method() {
		System.out.println("method Son");
	}
	
	public static void function() {
		System.out.println("function Son");
	}
}

class DuoTaiDemo {
	public static void main(String[] args) {
		//要有父類引用指向子類對象。
		Father f = new Son();
		
		//成員變量訪問特點
		System.out.println(f.num);	//輸出100,即運行看父類
		//System.out.println(f.num2); //找不到符號,即編譯看父類,父類沒有該變量,所以報錯
		
		//成員方法訪問特點
		f.show(); 	//輸出show Son,即運行看子類
		//f.method();	//找不到符號,即編譯看父類,父類沒有該方法,所以報錯
		
		f.function();	//輸出function Father,即編譯看父類,有則通過,運行看父類,輸出父類結果
	}
}

5.多態的好處

    A:提高代碼的維護性(繼承體現)

    B:提高代碼的擴展性(多態體現)

abstract class Animal {
	public void shoot() {}
}

class Dog extends Animal {
	public void shoot() {
		System.out.println("汪汪");
	}
}

class Cat extends Animal {
	public void shoot() {
		System.out.println("喵喵");
	}
}

class Person{
	private Animal animal;
	public Person(){}
	public Person(Animal animal){
		this.animal=animal;
	}
	public void shoot(){  
	       animal.shoot();  
	}  
	public void setAnimal(Animal animal){  
		//運用參數多態,以後方便養別的寵物  
		this.animal=animal;
	}
	
}

public class Test {
	public static void main(String[] args) {
		//我喜歡貓,就養了一隻
		Person p=new Person();
		Cat c = new Cat();
		p.setAnimal(c); //先養了只貓
		p.shoot();
		
		//我又喜歡狗了,所以換狗養
		Dog d = new Dog();
		p.setAnimal(d);
		p.shoot();
		
		//我喜歡寵物狼,老虎,豹子...
		//只需要定義對應的類,繼承自Animal,提供對應的方法重寫	,不用特地去Person類中添加。	
	}
}
6.多態的弊端與轉型

    父類不能使用子類的特有功能。

    如:上文第4點,成員方法訪問特點。

    那麼,如何改進才能調用呢?就用多態的轉型。

    A:向上轉型

    B:向下轉型

                Father father = new Son();//向下轉型
		Son son = (Son)father;//向上轉型
		son.show();
		son.method();

    轉型後,就可以在不多佔用內存的情況下(創建子類對象)調用子類特有方法。

7.多態內存佔用圖解

A:多態繼承內存佔用圖解


B:多態中對象變化內存佔用


8.多態貓狗案例

/*
	多態練習:貓狗案例
*/
class Animal {
	public void eat(){
		System.out.println("吃飯");
	}
}

class Dog extends Animal {
	public void eat() {
		System.out.println("狗吃肉");
	}
	
	public void lookDoor() {
		System.out.println("狗看門");
	}
}

class Cat extends Animal {
	public void eat() {
		System.out.println("貓吃魚");
	}
	
	public void playGame() {
		System.out.println("貓捉迷藏");
	}
}

class DuoTaiTest {
	public static void main(String[] args) {
		//定義爲狗
		Animal a = new Dog();
		a.eat();
		System.out.println("--------------");
		//還原成狗
		Dog d = (Dog)a;
		d.eat();
		d.lookDoor();
		System.out.println("--------------");
		//變成貓
		a = new Cat();
		a.eat();
		System.out.println("--------------");
		//還原成貓
		Cat c = (Cat)a;
		c.eat();
		c.playGame();
		System.out.println("--------------");
		
		//演示錯誤的內容
		//Dog dd = new Animal();
		//Dog ddd = new Cat();
		//Dog dd = (Dog)a;	//ClassCastException 類轉換出錯
	}
}	




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章