從零開始的Java學習生活(16)
技術標籤:從零開始的Java學習
文章目錄
前言
在前篇文章中我們講解了Java三大特性之一的繼承性,本篇文章中我們將繼續對面向物件程式設計的學習,瞭解並學習最後一個特性——多型性。
一、多型
(1)什麼是多型
多型:指的是物件的多型性,同一物件在不同時刻表現出來的不同形態。
例如:貓
我們可以說貓是貓:貓 cat = new 貓();
也可以說貓是動物:動物 animal = new 貓();
這裡貓在不同的時刻表現出來了不同的形態,就是多型。
(2)程式中的多型
多型的前提:
- 有繼承或者實現關係
- 有方法重寫
- 父類引用指向子類物件(或子類的物件賦值給父類的引用)
實現關係:後面會學習介面(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)多型的好處和弊端
好處:提高了程式的擴充套件性,容易設計出通用的程式碼。
弊端:遮蔽了子類獨有的功能。(不過,可以強轉型別)
總結
總的來說:多型用最簡單的一句話來解釋——父型別的引用指向子型別的物件。用一句比較通俗的話:同一操作作用於不同的物件,可以產生不同的效果。這就是多型。最後再強調需要注意的幾點:
- 多型情況下,子父類存在同名的成員變數時,訪問的是父類的成員變數。
- 多型情況下,子父類存在同名的非靜態的成員函式時,訪問的是子類的成員函式。
- 多型情況下,子父類存在同名的靜態的成員函式時,訪問的是父類的成員函式。
- 多型情況下,不能訪問子類特有的成員。
那麼我們本次學習內容到這裡就結束了,下一篇我們將開始java中另一個重要知識點——介面的學習。感謝大家觀看。