1. 程式人生 > 其它 >從零開始的Java學習生活(16)

從零開始的Java學習生活(16)

技術標籤:從零開始的Java學習

文章目錄


前言

在前篇文章中我們講解了Java三大特性之一的繼承性,本篇文章中我們將繼續對面向物件程式設計的學習,瞭解並學習最後一個特性——多型性。


一、多型

(1)什麼是多型

多型:指的是物件的多型性,同一物件在不同時刻表現出來的不同形態。

例如:貓

我們可以說貓是貓貓 cat = new 貓();

也可以說貓是動物動物 animal = new 貓();

這裡貓在不同的時刻表現出來了不同的形態,就是多型。

(2)程式中的多型

多型的前提:

  1. 有繼承或者實現關係
  2. 有方法重寫
  3. 父類引用指向子類物件(或子類的物件賦值給父類的引用)

實現關係:後面會學習介面(interface),類和介面就是實現關係,類實現介面。

實現關係也可以看成是繼承關係

3)多型示例

就上文提到的“貓是貓”,“動物是貓”來看:

父類Animal:

public class Animal {
	public void eat() {
		System.out.println("吃東西");
	}
}

子類Cat:

public class Cat extends Animal{
	
	@Override
	public void
eat() {//子類重寫父類方法 System.out.println("貓吃魚"); } public void catchMouse() { System.out.println("貓抓老鼠"); } }

測試類ClassTest:

public class ClassTest {
	public static void main(String[] args) {
		//正常使用:
		Animal animal = new Animal();
		animal.eat();
		
		Cat cat1 = new Cat
(); cat1.eat(); cat1.catchMouse(); System.out.println("----------") //多型: Animal animal2 = new Cat();//父類引用指向子類物件(或子類的物件賦值給父類的引用) animal2.eat();//執行Animal類的eat方法,還是執行Cat類的eat方法 animal2.catchMouse();//此處會報錯 } }

上面的Animal animal2 = new Cat();就是多型的體現,貓可以被當做動物來看待。

animal2.eat();這就是多型的使用。雖然貓可以當做動物來看待,但真正執行方法的時候,還是執行子類的方法。

animal2.catchMouse();會報錯,當把貓當動物看的時候,編譯器會檢視動物類是否有catchMouse方法,發現沒有,就會報錯。

(4) 多型中成員訪問的特點

看如下程式碼:

父類Animal:

public class Animal {
	int a = 20;
	
	public void eat() {
		System.out.println("吃東西");
	}
}

子類Cat:

public class Cat extends Animal{
	int a = 100;
	int b = 200;
	@Override
	public void eat() {//重寫父類的方法
		System.out.println("貓吃魚");
	}
	
	public void catchMouse() {//子類獨有的方法
		System.out.println("貓抓老鼠");
	}
}

測試類ClassTest:

public class ClassTest {
	public static void main(String[] args) {
		//正常使用:
		Animal animal = new Animal();
		animal.eat();
		
		Cat cat1 = new Cat();
		System.out.println(cat1.a);
		System.out.println(cat1.b);
		cat1.eat();
		cat1.catchMouse();
		System.out.println("--------------");
		//多型:
		Animal animal2 = new Cat();//父類引用指向子類物件(或子類的物件賦值給父類的引用)
		System.out.println(animal2.a);
//		System.out.println(animal2.b);//會報錯
		animal2.eat();//執行Cat類的eat
//		animal2.catchMouse();//此處會報錯。
	}
}

回顧:Java程式碼執行的流程
在這裡插入圖片描述

成員編譯期執行期
例項變數看等號左邊(即父類)看等號左邊(即父類)
例項方法看等號左邊(即父類)看等號右邊(即子類)

即 編譯看左邊,執行不一定看右邊!

為什麼例項變數和例項方法的訪問不一樣呢?

因為例項方法有重寫,例項變數沒有。

(5)多型的好處和弊端

好處:提高了程式的擴充套件性,容易設計出通用的程式碼。

弊端:遮蔽了子類獨有的功能。(不過,可以強轉型別)

總結

總的來說:多型用最簡單的一句話來解釋——父型別的引用指向子型別的物件。用一句比較通俗的話:同一操作作用於不同的物件,可以產生不同的效果。這就是多型。最後再強調需要注意的幾點:

  1. 多型情況下,子父類存在同名的成員變數時,訪問的是父類的成員變數。
  2. 多型情況下,子父類存在同名的非靜態的成員函式時,訪問的是子類的成員函式。
  3. 多型情況下,子父類存在同名的靜態的成員函式時,訪問的是父類的成員函式。
  4. 多型情況下,不能訪問子類特有的成員。

那麼我們本次學習內容到這裡就結束了,下一篇我們將開始java中另一個重要知識點——介面的學習。感謝大家觀看。