Java 多态、抽象类 笔记
1. Java 多態
多態就是同一個接口,使用不同的實例而執行不同操作.
1.1 多態存在的三個必要條件
- 繼承
- 重寫
- 父類引用指向子類對象(Parent p = new Child();)
當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調用子類的同名方法。(很重要)
多態的好處:可以使程序有良好的擴展,并可以對所有類的對象進行通用處理。
執行以上程序,輸出結果為:
吃魚 抓老鼠 吃骨頭 看家 吃魚 抓老鼠1.2 虛方法
我們已經討論了方法的重寫,也就是子類能夠重寫父類的方法。
當子類對象調用重寫的方法時,調用的是子類的方法,而不是父類中被重寫的方法。
要想調用父類中被重寫的方法,則必須使用關鍵字super。
例子:
- 如果實例中,實例化了兩個 Salary 對象:一個使用 Salary 引用 s,另一個使用 Employee 引用 e。
- 當調用 s.mailCheck() 時,編譯器在編譯時會在 Salary 類中找到 mailCheck(),執行過程 JVM 就調用 Salary 類的 mailCheck()。
- 因為 e 是 Employee 的引用,所以調用 e 的 mailCheck() 方法時,編譯器會去 Employee 類查找 mailCheck() 方法 。
- 在編譯的時候,編譯器使用 Employee 類中的 mailCheck() 方法驗證該語句, 但是在運行的時候,Java虛擬機(JVM)調用的是 Salary 類中的 mailCheck() 方法。
以上整個過程被稱為虛擬方法調用,該方法被稱為虛擬方法
1.3 多態的實現方式
方式一:重寫:
方式二:接口
方式三:抽象類和抽象方法
注:類的屬性變量是能重寫(覆蓋)
class Animal{public int age;public void move(){System.out.println("動物可以移動");} }class Dog extends Animal{public double age;public void move(){age = 10.00;System.out.println("狗可以跑和走");}public void bark(){System.out.println("狗可以吠叫");} }class Cat extends Animal{public void move(){super.age = 3;System.out.println("貓可以跳");} }public class TestOverride{public static void main(String args[]){Animal a = new Animal(); // Animal 對象Animal b = new Dog(); // Dog 對象Dog c = new Dog();Cat d = new Cat();a.move();// 執行 Animal 類的方法b.move();//執行 Dog 類的方法c.move();//執行 Dog 類的方法d.move();//執行 Cat 類的方法Object aValue = a.age;Object bValue = b.age;Object cValue = c.age;System.out.println("The type of "+a.age+" is "+(aValue instanceof Double ? "double" : (aValue instanceof Integer ? "int" : "")));System.out.println("The type of "+b.age+" is "+(bValue instanceof Double ? "double" : (bValue instanceof Integer ? "int" : "")));System.out.println("The type of "+c.age+" is "+(cValue instanceof Double ? "double" : (cValue instanceof Integer ? "int" : "")));// 覆蓋age屬性System.out.println("The age of cat is "+d.age);} }編譯值:
動物可以移動 狗可以跑和走 狗可以跑和走 貓可以跳 The type of 0 is int The type of 0 is int The type of 10.0 is double The age of cat is 3注;多態引用時,構造子類對象時的構造方法的調用順序
1,先調用超類的構造方法,多重超類首先調用最遠超類的方法;
2,然后再執行當前子類的構造方法;
調用時需要謹慎處理調用方法
2. Java 抽象類
在面向對象的概念中,所有的對象都是通過類來描繪的,但是反過來,并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
抽象類除了不能實例化對象之外,類的其它功能依然存在,成員變量、成員方法和構造方法的訪問方式和普通類一樣。
由于抽象類不能實例化對象,所以抽象類必須被繼承,才能被使用。也是因為這個原因,通常在設計階段決定要不要設計抽象類。
父類包含了子類集合的常見的方法,但是由于父類本身是抽象的,所以不能使用這些方法。
在Java中抽象類表示的是一種繼承關系,一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
2.1 抽象方法
如果你想設計這樣一個類,該類包含一個特別的成員方法,該方法的具體實現由它的子類確定,那么你可以在父類中聲明該方法為抽象方法。
Abstract關鍵字同樣可以用來聲明抽象方法,抽象方法只包含一個方法名,而沒有方法體。
抽象方法沒有定義,方法名后面直接跟一個分號,而不是花括號。
聲明抽象方法會造成以下兩個結果:
- 如果一個類包含抽象方法,那么該類必須是抽象類。
- 任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類。
繼承抽象方法的子類必須重寫該方法。否則,該子類也必須聲明為抽象類。最終,必須有子類實現該抽象方法,否則,從最初的父類到最終的子類都不能用來實例化對象。
抽象類總結規定:
注意:子抽象類繼承父抽象類,必須顯性調用父抽象類的顯性構造器
摘自:
http://www.runoob.com/java/java-abstraction.html
http://www.runoob.com/java/java-polymorphism.html
總結
以上是生活随笔為你收集整理的Java 多态、抽象类 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 尸香魔芋(说一说尸香魔芋的简介)
- 下一篇: 香橼树简介(香橼树)