您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎樣理解Java中的多態,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
繼承關系使一個子類能繼承父類的特征,并且附加一些新特征。子類是它的父類的特殊化,每個子類的實例都是其父類的實例,但是反過來不成立。例如:每個圓都是一個幾何對象,但并非每個幾何對象都是圓。因此,總可以將子類的實例傳給需要父類型的參數。參考案例如下:
public class PolymorphismDemo{ /** Main method */ public static void main(String[] args){ displayObject(new Circle(1,"red",false)); displayObject(new Rectangle(1,1,"black",true)); } public static void displayObject(GeometriicObject object){ System.out.println("Created on "+ object.getDateCreated()+".Color is"+object.getColor()); } }
Created on Mon Mar 09 19:25:20 EDT 2011.Color is red
Created on Mon Mar 09 19:25:20 EDT 2011.Color is black
方法displayObject具有GeometriicObject類型的參數。可以通過傳遞任何一個GeometriicObject的實例來調用displayObject。使用父類對象的地方都可以使用子類的對象。這就是通常說的多態。簡單來說,多態意味著父類型的變量可以引用子類型的對象。
多態的前提:繼承(即必須有子父類關系。)在使用多態后的父類引用變量調用方法時,會 調用子類重寫后的方法。 定義格式:父類類型 變量名=new 子類類型(); 父類引用指向子類對象,如:Animal a = new Cat(); 多態中,編譯看左邊,運行看右邊
instanceof是Java的關鍵字。Java關鍵字中的每個字母都是小寫的。
為了更好地理解類型轉換,可以認為它們類似于動物、北極熊、熊貓之間的關系,其中動物類Animal是北極熊類Polar bear和熊貓類Panda類的父類。北極熊是動物,所以,總是可以將 Polar bear的實例安全地賦值給Animal變量。該關鍵字用法是判斷某個對象是否屬于某種數據類型,返回值為布爾類型。
Fu Zz=new Xu(); Fu Zzz=new yiting(); if(f1 instanceof Xu){ System.out.println("Zz是Xu的類型"); } else{ System.out.println("Zzz是yiting的類型"); }
總是可以將一個子類的實例轉換為一個父類的變量,稱為向上轉換,因為子類的實例總是它的父類的實例。
作用:
減少一些重復的代碼對象實例化的時候可以根據不同需求實例化不同的對象
package project2; class Animal{ int num=100; void say(){ System.out.println("It's an Animal."); } } class Cat extends Animal{ int num=50; void say(){ System.out.println("It's a Cat."); } void bark(){ System.out.println("喵喵喵!"); } } public class project2{ public static void main(String[] args) { Animal cat=new Cat();//向上轉型 System.out.println(cat.num); cat.say(); // cat.bark(); } }
運行結果:
100
It's a Cat.
向上轉型不要強制轉型,父類引用指向的或者調用的方法是子類的方法,這個叫動態綁定。向上轉型后父類引用不能調用子類自己的方法。
把一個父類的實例轉換為它的子類變量。必須使用轉換標記(子類名)進行顯示轉換,向編譯器表明你的意圖。為使轉換成功,必須確保要轉換的對象是子類的一個實例。
作用:
向上轉型時 ,會遺失子類對象獨有的其他方法;可以通過向下轉型再重新轉回。
package project2; class Animal{ int num=100; void say(){ System.out.println("It's an Animal."); } } class Cat extends Animal{ int num=50; void say(){ System.out.println("It's a Cat."); } void bark(){ System.out.println("喵喵喵!"); } } public class project2{ public static void main(String[] args) { Animal cat=new Cat();//向上轉型 Cat cat2=(Cat) cat;//向下轉型 System.out.println(cat2.num); cat2.say(); cat2.bark(); } }
運行結果:
50
It's a Cat.
喵喵喵!
提示:要重寫一個方法,需要在子類中使用和父類一樣的簽名來對該方法進行定義。
子類從父類中繼承方法。有時,子類需要修改父類中定義的方法的實現,這稱為方法重寫。
以下幾點值得注意:
重寫的方法必須與被重寫的方法具有一樣的簽名,以及一樣或者兼容的返回類型。兼容的含義是重寫方法的返回類型可以是被重寫方法的返回類型的子類型。僅當實例方法可訪問時,它才能被重寫。如果子類中定義的方法在父類中是私有的,那么這兩個方法完全沒有關系。與實例方法一樣,靜態方法也能被繼承。但是,靜態方法不能被重寫。如果父類定義的靜態方法在子類中被重新定義,那么在父類中定義的靜態方法將被隱藏。可以使用語法“父類名.靜態方法名”調用隱藏的靜態方法。防止繼承和重寫
一個被final修飾的類和方法都不能被繼承。被final修飾的數據域是一個常數。
有時候,可能希望防止類被繼承。在這種情況下,使用final修飾符表明一個類是最終類,是不能作為父類的。Math類就是一個最終類。String、StringBuilder和StringBuffer類以及所有基本數據類型的包裝類也都是最終類。例如,如下類A 就是最終類,不能被繼承:
public final class A{ //Data fields,constructors, and methods omitted }
也可以定義一個方法為最終,最終方法不能被它的子類重寫。例如如下,不能被重寫:
public class Test { //Data fields,constructors, and methods omitted public final void m() { // Do something } }
注:修飾符public、protected、private、static、abstract以及final可以用在類和類的成員上,只有final修飾符還可以用在方法中的局部變量上。方法內的final局部變量就是常量。
為了重寫一個方法,必須使用與它的父類中的方法一樣的簽名、一樣或者兼容的返回類型來定義子類中的方法。實例方法只有在可訪問時才能重寫。這樣,私有方法是不能重寫的,因為它是不能在類本身之外訪問的。如果子類中定義的方法在父類中是私有的,那么這兩個方法是完全沒有關系的噢!靜態方法與實例方法一樣可以繼承。但是,靜態方法不能重寫,如果父類中定義的靜態方法在子類中重新定義,那么父類中定義的方法被隱藏。可以使用表達式obj instanceof AClass 測試一個對象是否是一個類的實例。可以使用final修飾符來表明一個類是最終類,是不能被繼承的;也可以表明一個方法是最終的,是不能被重寫的。
看完上述內容,你們對怎樣理解Java中的多態有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。