亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java三大特性之多態(tài)詳解

 更新時間:2022年10月11日 14:26:08   作者:共飲一杯無  
多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦浴6鄳B(tài): 是指同一行為,具有多個不同表現(xiàn)形式。本文將來和大家詳細說說Java中的多態(tài),需要的可以了解一下

概述

引入

多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦浴?生活中,比如跑的動作,小貓、小狗和大象,跑起來是不一樣的。再比如飛的動作,昆蟲、鳥類和飛機,飛起來也是不一樣的。可見,同一行為,通過不同的事物,可以體現(xiàn)出來的不同的形態(tài)。多態(tài),描述的就是這樣的狀態(tài)。

定義

多態(tài): 是指同一行為,具有多個不同表現(xiàn)形式。

多態(tài)的體現(xiàn)

多態(tài)體現(xiàn)的格式:

父類類型 變量名 = new 子類對象; 變量名.方法名();

父類類型:指子類對象繼承的父類類型,或者實現(xiàn)的父接口類型。 代碼如下:

Fu f = new Zi();
f.method();

當使用多態(tài)方式調(diào)用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,執(zhí)行的是子類重寫后方法。 代碼如下: 定義父類:

public abstract class Animal {
    public abstract void eat();
}

定義子類:

class Cat extends Animal {
    public void eat() {
        System.out.println("吃魚??");
    }
}
class Dog extends Animal {
    public void eat() {
        System.out.println("吃骨頭??");
    }
}

定義測試類:

public class Test {
    public static void main(String[] args) {
        // 多態(tài)形式,創(chuàng)建對象
        Animal a1 = new Cat();
        // 調(diào)用的是 Cat 的 eat
        a1.eat();
        // 多態(tài)形式,創(chuàng)建對象
        Animal a2 = new Dog();
        // 調(diào)用的是 Dog 的 eat
        a2.eat();
    }
}

多態(tài)的好處

實際開發(fā)的過程中,父類類型作為方法形式參數(shù),傳遞子類對象給方法,進行方法的調(diào)用,更能體現(xiàn)出多態(tài)的擴展性與便利。代碼如下: 定義父類:

public abstract class Animal {
    public abstract void eat();
}

定義子類:

class Cat extends Animal {
    public void eat() {
        System.out.println("吃魚??");
    }
}
class Dog extends Animal {
    public void eat() {
        System.out.println("吃骨頭??");
    }
}

定義測試類:

public class Test {
    public static void main(String[] args) {
        // 多態(tài)形式,創(chuàng)建對象
        Cat c = new Cat();
        Dog d = new Dog();
        // 調(diào)用showCatEat
        showCatEat(c);
        // 調(diào)用showDogEat
        showDogEat(d);
        /**
        以上兩個方法, 均可以被showAnimalEat(Animal a)方法所替代
        而執(zhí)行效果一致
        */
        showAnimalEat(c);
        showAnimalEat(d);
    }
    public static void showCatEat (Cat c){
        c.eat();
    }
    public static void showDogEat (Dog d){
        d.eat();
    }
    public static void showAnimalEat (Animal a){
        a.eat();
    }
}

由于多態(tài)特性的支持,showAnimalEat方法的Animal類型,是Cat和Dog的父類類型,父類類型接收子類對象,當然可以把Cat對象和Dog對象,傳遞給方法。 當eat方法執(zhí)行時,多態(tài)規(guī)定,執(zhí)行的是子類重寫的方法,那么效果自然與showCatEat、showDogEat方法一致, 所以showAnimalEat完全可以替代以上兩方法。 不僅僅是替代,在擴展性方面,無論之后再多的子類出現(xiàn),我們都不需要編寫showXxxEat方法了,直接使用 showAnimalEat都可以完成。 所以,多態(tài)的好處,體現(xiàn)在,可以使程序編寫的更簡單,并有良好的擴展。

引用類型轉(zhuǎn)換

多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型與向下轉(zhuǎn)型兩種:

向上轉(zhuǎn)型

向上轉(zhuǎn)型:多態(tài)本身是子類類型向父類類型向上轉(zhuǎn)換的過程,這個過程是默認的。 當父類引用指向一個子類對象時,便是向上轉(zhuǎn)型。 使用格式:

父類類型 變量名 = new 子類類型(); 如:Animal a = new Cat();

向下轉(zhuǎn)型

向下轉(zhuǎn)型:父類類型向子類類型向下轉(zhuǎn)換的過程,這個過程是強制的。 一個已經(jīng)向上轉(zhuǎn)型的子類對象,將父類引用轉(zhuǎn)為子類引用,可以使用強制類型轉(zhuǎn)換的格式,便是向下轉(zhuǎn)型。 使用格式:

子類類型 變量名 = (子類類型) 父類變量名; 如:Cat c =(Cat) a;

為什么要轉(zhuǎn)型

當使用多態(tài)方式調(diào)用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤。也就是說,不能調(diào)用子類擁有,而父類沒有的方法。編譯都錯誤,更別說運行了。這也是多態(tài)給我們帶來的一點"小麻煩"。所以,想要調(diào)用子類特有的方法,必須做向下轉(zhuǎn)型。 轉(zhuǎn)型演示,代碼如下: 定義類:

abstract class Animal {
    abstract void eat();
}
class Cat extends Animal {
    public void eat() {
        System.out.println("吃魚??");
    }
    public void catchMouse() {
        System.out.println("抓老鼠??");
    }
}
class Dog extends Animal {
    public void eat() {
        System.out.println("吃骨頭??");
    }
    public void watchHouse() {
        System.out.println("看家??");
    }
}

定義測試類:

public static void main(String[] args) {
    // 向上轉(zhuǎn)型
    Animal a = new Cat();
    a.eat(); // 調(diào)用的是 Cat 的 eat
    // 向下轉(zhuǎn)型
    Cat c = (Cat)a;
    c.catchMouse(); // 調(diào)用的是 Cat 的 catchMouse
}

轉(zhuǎn)型的異常

轉(zhuǎn)型的過程中,一不小心就會遇到這樣的問題,請看如下代碼:

public class Test {
    public static void main(String[] args) {
        // 向上轉(zhuǎn)型
        Animal a = new Cat();
        a.eat(); // 調(diào)用的是 Cat 的 eat
        // 向下轉(zhuǎn)型
        Dog d = (Dog)a;
        d.watchHouse(); // 調(diào)用的是 Dog 的 watchHouse 【運行報錯】
    }
}

這段代碼可以通過編譯,但是運行時,卻報出了 ClassCastException ,類型轉(zhuǎn)換異常!這是因為,明明創(chuàng)建了Cat類型對象,運行時,當然不能轉(zhuǎn)換成Dog對象的。這兩個類型并沒有任何繼承關(guān)系,不符合類型轉(zhuǎn)換的定義。為了避免ClassCastException的發(fā)生,Java提供了 instanceof 關(guān)鍵字,給引用變量做類型的校驗,格式如下:

變量名 instanceof 數(shù)據(jù)類型 如果變量屬于該數(shù)據(jù)類型,返回true。 如果變量不屬于該數(shù)據(jù)類型,返回false。

所以,轉(zhuǎn)換前,我們最好先做一個判斷,代碼如下:

public class Test {
    public static void main(String[] args) {
    // 向上轉(zhuǎn)型
        Animal a = new Cat();
        a.eat(); // 調(diào)用的是 Cat 的 eat
        // 向下轉(zhuǎn)型
        if (a instanceof Cat){
            Cat c = (Cat)a;
            c.catchMouse(); // 調(diào)用的是 Cat 的 catchMouse
        } else if (a instanceof Dog){
            Dog d = (Dog)a;
            d.watchHouse(); // 調(diào)用的是 Dog 的 watchHouse
        }
    }
}

以上就是Java三大特性之多態(tài)詳解的詳細內(nèi)容,更多關(guān)于Java多態(tài)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringMVC與前端交互案例教程

    SpringMVC與前端交互案例教程

    本篇文章主要介紹了SpringMVC前端和后端數(shù)據(jù)交互總結(jié),具有一定的參考價值,感興趣的小伙伴們可以參考一下。希望能給你帶來幫助
    2021-07-07
  • JAVA 深層拷貝 DeepCopy的使用詳解

    JAVA 深層拷貝 DeepCopy的使用詳解

    最近需要用到比較兩個對象屬性的變化,其中一個是oldObj,另外一個是newObj,oldObj是newObj的前一個狀態(tài),所以需要在newObj的某個狀態(tài)時,復(fù)制一個一樣的對象,由于JAVA不支持深層拷貝,因此專門寫了一個方法
    2013-07-07
  • SpringBoot中的文件上傳與下載詳解

    SpringBoot中的文件上傳與下載詳解

    這篇文章主要介紹了SpringBoot中的文件上傳與下載詳解,springboot是spring家族中的一個全新框架,用來簡化spring程序的創(chuàng)建和開發(fā)過程,本文我們就一起來看看上傳與下載的操作,需要的朋友可以參考下
    2023-08-08
  • java中跨域問題解決的幾種方式

    java中跨域問題解決的幾種方式

    這篇文章主要給大家介紹了關(guān)于java中跨域問題解決的幾種方式, 在前后端分離項目中,經(jīng)常會遇到跨域問題,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Java根據(jù)控制臺實現(xiàn)定位異常

    Java根據(jù)控制臺實現(xiàn)定位異常

    這篇文章主要介紹了Java根據(jù)控制臺定位異常,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Spring的跨域的幾個方案

    Spring的跨域的幾個方案

    這篇文章主要介紹了Spring的跨域的幾個方案,CrossOrigin、addCorsMappings、CorsFIlter等方案,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • Java 多線程有序執(zhí)行的幾種方法總結(jié)

    Java 多線程有序執(zhí)行的幾種方法總結(jié)

    這篇文章主要介紹了Java 多線程有序執(zhí)行的幾種方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java中final,finally,finalize三個關(guān)鍵字的區(qū)別_動力節(jié)點Java學(xué)院整理

    Java中final,finally,finalize三個關(guān)鍵字的區(qū)別_動力節(jié)點Java學(xué)院整理

    這篇文章給大家收集整理了有關(guān)java中final,finally,finalize三個關(guān)鍵字的區(qū)別介紹,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-04-04
  • java中TreeMap集合的常用方法詳解

    java中TreeMap集合的常用方法詳解

    本篇文章給大家?guī)淼膬?nèi)容是關(guān)于java中TreeMap集合的常用方法詳解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。下面我們就來學(xué)習(xí)一下吧
    2021-11-11
  • IDEA在Maven項目中使用本地jar包的方法

    IDEA在Maven項目中使用本地jar包的方法

    我們在拿到舊項目的時候,經(jīng)常會遇到一種情況,就是這個項目的maven中依賴了一個本地的jar包,這種情況就需要引入這個jar包,所以本文給大家介紹了IDEA在Maven項目中使用本地jar包的方法,需要的朋友可以參考下
    2024-04-04

最新評論