Java學習筆記9(面象對象9:多態)
多態概述
多態是繼封裝、繼承後,面對對象的第三大特性。
現實事物經常會出現多態,如學生,學生是人的一種,則一個具體的同學張三既是學生也是人,即出現兩種形態。
Java作為面向對象的語言,同樣可以描述一個事物的多種形態。如Student類繼承了Person類,一個Student的對象便
既是Student,又是Person。
Java種多態的代碼體現在一個子類對象(實現類對象)既可以給這個子類(實現類對象)引用變量賦值,又可以給這
個子類(實現類對象)的父類(接口)變量賦值。如:Student類可以為Person類的子類。那麽一個Student對象 s既可以賦
值給一個Student類型的引用,也可以賦值給一個Person類型的引用。
Student s=new Student(); Person s=new Student();
最終多態 體現為父類引用變量可以指向子類對象。左父 右子
多態的前提是必須有子父類關系或者類實現接口關系,否則無法完成多態。
在使用多態後的父類引用變量調用方法時,會調用子類重寫後的方法。
public class Person { public void speak(){ System.out.println("說話"); } }public class Student extends Person{ public void speak(){//重寫speak方法 System.out.println("不說話"); } public void study(){ System.out.println("學習"); } } public class Test { public static void main(String[] args) { //多態創建變量:父類引用類型 變量名=new 子類(); Person s=newStudent(); s.speak();//調用speak方法,運行結果為:不說話,可以看出調用的是子類重寫後的方法 } }
調用多態的格式
A:多態的定義格式:父類類型 變量名=new 子類類型();變量名.方法名();
B:抽象類多態定義格式:抽象類 變量名=new 抽象類子類();
C: 接口多態定義的格式:接口 變量名=new 接口實現類();
註意事項:同一個父類的方法會被不同的子類重寫。在調用方法時,調用的為各個子類重寫後的方法。
instanceof關鍵字
作用:可以通過instanceof關鍵字來判斷某個對象是否屬於某種數據類型。如學生的對象屬於學生類,學生的對象也屬於
人的類。instanceof的用法: (要判斷的對象)s instanceof (要判斷的數據類型)如:
public class Test { public static void main(String[] args) { //多態創建變量:父類引用類型 變量名=new 子類(); Student s=new Student(); Person p=new Person(); if (s instanceof Person) {//判斷Student類的對象s是否屬於Person數據類型 System.out.println("true");//因為Student類時Person的子類,所以條件成立,輸出true } boolean x=p instanceof Student;/*定義變量x接收判斷結果,判斷條件是Person 對象p是否屬於Student數據類型;很明顯不屬於*/ System.out.println(x);//輸出結果flase } }
多態轉型:
多態的轉型分為向上轉型和向下轉型兩種:
向上轉型:當有子類對象賦值給一個父類引用時,便是向上轉型,多態本身就是向上轉型的過程。
使用格式:父類類型 變量名=new 子類類型();
向下轉型:一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用轉為子類引用,這個過程時向下轉
型。如果是直接創建父類對象,是無法向下轉型的!
使用格式:子類類型 變量名=(子類類型)父類類型的變量;
如;Student stu=(Student) p;
多態的好處和弊端
當父類的引用類型指向子類對象時,就發生了向上轉型,即把子類類型對象轉成了父類類型。
向上轉型的好處是隱藏了子類類型,提高了代碼的擴展性。
但向上轉型也有弊端,只能使用父類共性的內容,而無法使用子類特有的功能,功能有限。
多態運行看右邊,編譯看左邊
(個人理解,當父類需要調用子類重寫過的同名方法時,用多態向上轉型,當父類需要調用子類自己的方法的時候,用向下轉型)
Java學習筆記9(面象對象9:多態)