溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎樣理解Java中的多態(tài)

發(fā)布時(shí)間:2021-12-20 09:07:17 來源:億速云 閱讀:159 作者:柒染 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)怎樣理解Java中的多態(tài),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

    一、多態(tài)的概念

           繼承關(guān)系使一個(gè)子類能繼承父類的特征,并且附加一些新特征。子類是它的父類的特殊化,每個(gè)子類的實(shí)例都是其父類的實(shí)例,但是反過來不成立。例如:每個(gè)圓都是一個(gè)幾何對象,但并非每個(gè)幾何對象都是圓。因此,總可以將子類的實(shí)例傳給需要父類型的參數(shù)。參考案例如下:

    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類型的參數(shù)??梢酝ㄟ^傳遞任何一個(gè)GeometriicObject的實(shí)例來調(diào)用displayObject。使用父類對象的地方都可以使用子類的對象。這就是通常說的多態(tài)。簡單來說,多態(tài)意味著父類型的變量可以引用子類型的對象。

    二、多態(tài)的特點(diǎn)

     多態(tài)的前提:繼承(即必須有子父類關(guān)系。)在使用多態(tài)后的父類引用變量調(diào)用方法時(shí),會   調(diào)用子類重寫后的方法。 定義格式:父類類型 變量名=new 子類類型();                                                                       父類引用指向子類對象,如:Animal a = new Cat(); 多態(tài)中,編譯看左邊,運(yùn)行看右邊

    三、instanceof操作符

           instanceof是Java的關(guān)鍵字。Java關(guān)鍵字中的每個(gè)字母都是小寫的。

           為了更好地理解類型轉(zhuǎn)換,可以認(rèn)為它們類似于動物、北極熊、熊貓之間的關(guān)系,其中動物類Animal是北極熊類Polar bear和熊貓類Panda類的父類。北極熊是動物,所以,總是可以將 Polar bear的實(shí)例安全地賦值給Animal變量。該關(guān)鍵字用法是判斷某個(gè)對象是否屬于某種數(shù)據(jù)類型,返回值為布爾類型。

     
            Fu Zz=new Xu();
            Fu Zzz=new yiting();
            if(f1 instanceof Xu){
                System.out.println("Zz是Xu的類型");
            }
            else{
                System.out.println("Zzz是yiting的類型");
            }

    四、多態(tài)的轉(zhuǎn)型

    1、向上轉(zhuǎn)型

           總是可以將一個(gè)子類的實(shí)例轉(zhuǎn)換為一個(gè)父類的變量,稱為向上轉(zhuǎn)換,因?yàn)樽宇惖膶?shí)例總是它的父類的實(shí)例。

    作用:

    減少一些重復(fù)的代碼對象實(shí)例化的時(shí)候可以根據(jù)不同需求實(shí)例化不同的對象

    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();//向上轉(zhuǎn)型	
    			System.out.println(cat.num);
    			cat.say();
    //			cat.bark();
    		}
    	}

    運(yùn)行結(jié)果:

    100
    It's a Cat.

    向上轉(zhuǎn)型不要強(qiáng)制轉(zhuǎn)型,父類引用指向的或者調(diào)用的方法是子類的方法,這個(gè)叫動態(tài)綁定。向上轉(zhuǎn)型后父類引用不能調(diào)用子類自己的方法。

    2、向下轉(zhuǎn)型

           把一個(gè)父類的實(shí)例轉(zhuǎn)換為它的子類變量。必須使用轉(zhuǎn)換標(biāo)記(子類名)進(jìn)行顯示轉(zhuǎn)換,向編譯器表明你的意圖。為使轉(zhuǎn)換成功,必須確保要轉(zhuǎn)換的對象是子類的一個(gè)實(shí)例。

    作用:

            向上轉(zhuǎn)型時(shí) ,會遺失子類對象獨(dú)有的其他方法;可以通過向下轉(zhuǎn)型再重新轉(zhuǎn)回。

    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();//向上轉(zhuǎn)型
    		Cat cat2=(Cat) cat;//向下轉(zhuǎn)型
    		System.out.println(cat2.num);
    		cat2.say();
    		cat2.bark();
    	}
    }

    運(yùn)行結(jié)果:

    50
    It's a Cat.
    喵喵喵!

    五、方法重寫

    提示:要重寫一個(gè)方法,需要在子類中使用和父類一樣的簽名來對該方法進(jìn)行定義。

    子類從父類中繼承方法。有時(shí),子類需要修改父類中定義的方法的實(shí)現(xiàn),這稱為方法重寫。

    以下幾點(diǎn)值得注意:

    重寫的方法必須與被重寫的方法具有一樣的簽名,以及一樣或者兼容的返回類型。兼容的含義是重寫方法的返回類型可以是被重寫方法的返回類型的子類型。僅當(dāng)實(shí)例方法可訪問時(shí),它才能被重寫。如果子類中定義的方法在父類中是私有的,那么這兩個(gè)方法完全沒有關(guān)系。與實(shí)例方法一樣,靜態(tài)方法也能被繼承。但是,靜態(tài)方法不能被重寫。如果父類定義的靜態(tài)方法在子類中被重新定義,那么在父類中定義的靜態(tài)方法將被隱藏??梢允褂谜Z法“父類名.靜態(tài)方法名”調(diào)用隱藏的靜態(tài)方法。防止繼承和重寫

           一個(gè)被final修飾的類和方法都不能被繼承。被final修飾的數(shù)據(jù)域是一個(gè)常數(shù)。

           有時(shí)候,可能希望防止類被繼承。在這種情況下,使用final修飾符表明一個(gè)類是最終類,是不能作為父類的。Math類就是一個(gè)最終類。String、StringBuilder和StringBuffer類以及所有基本數(shù)據(jù)類型的包裝類也都是最終類。例如,如下類A 就是最終類,不能被繼承:

    public final class A{
      //Data fields,constructors, and methods omitted
    }

           也可以定義一個(gè)方法為最終,最終方法不能被它的子類重寫。例如如下,不能被重寫:

    public class Test {
      //Data fields,constructors, and methods omitted
     
      public final void m() {
        // Do something
     }
    }

    注:修飾符public、protected、private、static、abstract以及final可以用在類和類的成員上,只有final修飾符還可以用在方法中的局部變量上。方法內(nèi)的final局部變量就是常量。

    為了重寫一個(gè)方法,必須使用與它的父類中的方法一樣的簽名、一樣或者兼容的返回類型來定義子類中的方法。實(shí)例方法只有在可訪問時(shí)才能重寫。這樣,私有方法是不能重寫的,因?yàn)樗遣荒茉陬惐旧碇庠L問的。如果子類中定義的方法在父類中是私有的,那么這兩個(gè)方法是完全沒有關(guān)系的噢!靜態(tài)方法與實(shí)例方法一樣可以繼承。但是,靜態(tài)方法不能重寫,如果父類中定義的靜態(tài)方法在子類中重新定義,那么父類中定義的方法被隱藏??梢允褂帽磉_(dá)式obj instanceof AClass 測試一個(gè)對象是否是一個(gè)類的實(shí)例??梢允褂胒inal修飾符來表明一個(gè)類是最終類,是不能被繼承的;也可以表明一個(gè)方法是最終的,是不能被重寫的。

    看完上述內(nèi)容,你們對怎樣理解Java中的多態(tài)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI