最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的多態(tài)、抽象類(lèi)和接口詳解

 更新時(shí)間:2022年04月06日 17:55:58   作者:長(zhǎng)歌_w  
這篇文章詳細(xì)講解了Java的多態(tài)、抽象類(lèi)和接口,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.多態(tài)

一個(gè)特定類(lèi)型的變量,可以引用多個(gè)不同類(lèi)型的對(duì)象,并且能自動(dòng)調(diào)用引用對(duì)象的方法,也就是根據(jù)引用對(duì)象的不同,響應(yīng)不同的操作

方法重寫(xiě)是多態(tài)的基礎(chǔ),在繼承中,子類(lèi)擁有和父類(lèi)相同的方法(方法名稱(chēng)、參數(shù)、返回值)稱(chēng)為重寫(xiě)

package com.itlaobing.demo;
public class Pet {
    public void toHospital() {
        System.out.println("寵物看病");
    }
}
class Dog extends Pet{
    public void toHospital() {
        System.out.println("狗狗看病");
    }
}
class Cat extends Pet{
    public void toHospital() {
        System.out.println("貓貓看病");
    }
}
public static void main(String[] args) {
    Dog dog = new Dog() ;
    dog.toHospital();//狗狗看病
    Cat cat = new Cat();
    cat.toHospital(); //貓貓看病
    System.out.println("=================");
    //多態(tài)
    Pet pet;
    pet = new Dog();
    pet.toHospital();//狗狗看病
    pet = new Cat();
    pet.toHospital(); //貓貓看病
}

多態(tài)中,變量引用的是哪個(gè)對(duì)象,就執(zhí)行的是哪個(gè)對(duì)象中相對(duì)應(yīng)的方法。

多態(tài)意味著在一次方法調(diào)用中根據(jù)包含的對(duì)象的實(shí)際類(lèi)型(即實(shí)際子類(lèi)的對(duì)象)來(lái)決定應(yīng)該調(diào)用哪個(gè)子類(lèi)的方法,而不是由用來(lái)存儲(chǔ)對(duì)象引用變量的類(lèi)型決定的。當(dāng)調(diào)用一個(gè)方法時(shí),為了實(shí)現(xiàn)多態(tài)操作,這個(gè)方法即是在父類(lèi)中聲明過(guò)的,也必須是在子類(lèi)中重寫(xiě)過(guò)的方法

1.1 向上轉(zhuǎn)型

由子類(lèi)類(lèi)型轉(zhuǎn)換成父類(lèi)類(lèi)型,稱(chēng)為向上轉(zhuǎn)型。父類(lèi)引用指向子類(lèi)對(duì)象

//父類(lèi)類(lèi)型 變量 = 子類(lèi)類(lèi)型實(shí)例;
Pet pet = new Dog();//向上轉(zhuǎn)型

多態(tài)就是說(shuō)一個(gè)父類(lèi)可能有多個(gè)子類(lèi),每個(gè)子類(lèi)都重寫(xiě)了父類(lèi)的方法(每個(gè)子類(lèi)都有不同方法實(shí)現(xiàn)),當(dāng)父類(lèi)調(diào)用方法時(shí),父類(lèi)引用指向的是哪個(gè)子類(lèi),就執(zhí)行哪個(gè)子類(lèi)的方法。形成了父類(lèi)引用調(diào)用相同的方法時(shí),有不同的實(shí)現(xiàn)。

父類(lèi)引用只能調(diào)用父類(lèi)中有的方法(子類(lèi)繼承自父類(lèi)的方法/重寫(xiě)的方法)

父類(lèi)引用不能調(diào)用子類(lèi)擴(kuò)展的方法(獨(dú)有的方法)

1.2 向下轉(zhuǎn)型

有父類(lèi)類(lèi)型轉(zhuǎn)換成子類(lèi)類(lèi)型,稱(chēng)為向下轉(zhuǎn)型。必須要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。

注意:首先要判斷是否屬于要強(qiáng)轉(zhuǎn)的類(lèi)型(instanceof),如果不屬于會(huì)報(bào)錯(cuò)java.lang.ClassCastException

public static void main(String[] args) {
    // Dog dog = (Dog) new Pet();//向下轉(zhuǎn)型     java.lang.ClassCastException
 ? ?// System.out.println(new Pet() instanceof Dog);    // false
    Pet pet = new Dog(); //向上轉(zhuǎn)型
    Dog dog = null;
    if(pet instanceof Dog){
        dog = (Dog) pet; //向下轉(zhuǎn)型
    }
    System.out.println(pet.getClass()); //class com.itlaobing.demo.Dog
    System.out.println(pet instanceof Dog); //true
}

1.3 實(shí)現(xiàn)多態(tài)的條件

①類(lèi)之間存在繼承關(guān)系

②父類(lèi)引用指向子類(lèi)對(duì)象(向上轉(zhuǎn)型)

③子類(lèi)要重寫(xiě)父類(lèi)的方法

1.4多態(tài)的特點(diǎn)與使用

特點(diǎn):①可替換性②可擴(kuò)充性③接口性④靈活性⑤簡(jiǎn)化性

使用:①接口②重寫(xiě)③抽象類(lèi)方法

1.5多態(tài)的應(yīng)用

以父類(lèi)類(lèi)型作為方法的參數(shù)

父類(lèi)類(lèi)型出現(xiàn)的地方,子類(lèi)都可以出現(xiàn)(使用)

public void toHost(Pet pet) {
    System.out.print("主人帶");
    pet.toHospital();
}
public static void main(String[] args) {
    Person person = new Person();
 ? ?
    Dog dog = new Dog();
    person.toHost(dog);
 ? ?
    Cat cat = new Cat();
    person.toHost(cat);
 ? ?
    Pet pet = new Pet();
    person.toHost(pet);
}

使用父類(lèi)型作為方法的返回值

public Pet getPet(int type) {
    if(1 == type) {
        return new Dog();
    }else if(2 == type) {
        return new Cat();
    }else {
        return new Pet();
    }
}

1.6 多態(tài)的注意點(diǎn)

public class Pet {
    
    public Pet getInstance() {
        System.out.println("pet getInstance()");
        return new Pet();
    }
    
    public static void staticMethod() {
        System.out.println("Pet  staticMethod()");
    }
?
}
?
class Dog extends Pet{
?
    @Override
    public Dog getInstance() {
        System.out.println("Dog getInstance()");
        return new Dog();
    }
    
    public static void staticMethod() {
        System.out.println("Dog  staticMethod()");
    }
    
    
}
public static void main(String[] args) {
        Pet p = new Dog();
        p.getInstance(); // Dog getInstance()
        p.staticMethod();// Pet  staticMethod()
    }

p.getInstance()調(diào)用的是 Dog 類(lèi)中的方法,因?yàn)樵?Dog 類(lèi)中重寫(xiě)了 Pet 中的 getInstance()方法,且調(diào)用實(shí)例方法看的是哪個(gè)對(duì)象調(diào)用就執(zhí)行哪個(gè)對(duì)象中的方法。也就是說(shuō) by Class。

p.staticMethod()調(diào)用的是 Pet 類(lèi)中的方法,因?yàn)?nbsp;staticMethod()是 static 方法,屬于 類(lèi)。雖然 Dog 類(lèi)中隱藏了父類(lèi)的方法,但是調(diào)用 static 方法看的是類(lèi)型,也就是說(shuō) by type ,并且這和多態(tài)無(wú)關(guān)。

可以簡(jiǎn)單的說(shuō),調(diào)用 static 方法看左邊。調(diào)用 實(shí)例方法 看右邊。

2.抽象類(lèi)

public class Pet {
    public void toHospital() {
        System.out.println("寵物看病");
    }
}
public class Dog extends Pet {
    public void porter() {
        System.out.println("看門(mén)狗");
    }
    public void toHospital() {
        System.out.println("狗狗看病");
    }
}
public class Cat extends Pet{
    public void catchMouse() {
        System.out.println("貓捉老鼠");
    }
    public void toHospital() {
        System.out.println("貓貓看病");
    }
}

從上面的代碼可以 發(fā)現(xiàn),父類(lèi)中的的 toHospital()方法并沒(méi)有實(shí)際意義,只是定義了一個(gè)規(guī)范,但是刪除之后,調(diào)用會(huì)報(bào)錯(cuò)。失去了多態(tài)的特性。抽象類(lèi)/抽象方法作用就是定義規(guī)范

2.1 abstract關(guān)鍵字

在 java 中,被 abstract 關(guān)鍵字修飾的類(lèi)叫做抽象類(lèi),被 abstract 關(guān)鍵字修飾的方法叫做抽象方法。 抽象方法是沒(méi)有具體實(shí)現(xiàn)(沒(méi)有方法體)的。 abstract 不能和 final 一起使用。

2.2 抽象方法和普通方法的區(qū)別

[修飾符] 返回值類(lèi)型 方法名([參數(shù)列表]){ //普通方法
    //方法體
}
[修飾符] abstract 返回值類(lèi)型 方法名([參數(shù)列表]); //抽象方法

抽象方法沒(méi)有具體的實(shí)現(xiàn)(沒(méi)有方法體),所以,抽象不能執(zhí)行。

抽象方法是由繼承了抽象類(lèi)的子類(lèi)重寫(xiě)后調(diào)用子類(lèi)重寫(xiě)的方法來(lái)執(zhí)行。

區(qū)別:

①抽象方法有abstract修飾

②抽象方法沒(méi)有方法體

③抽象方法無(wú)法執(zhí)行

④抽象方法不能用private修飾,因?yàn)楸?code>private修飾的成員無(wú)法被繼承

2.3 抽象類(lèi)和普通類(lèi)的區(qū)別

[修飾符] abstract class 類(lèi)名{} //抽象類(lèi)
[修飾符] class 類(lèi)名{} //普通類(lèi)

抽象類(lèi)中可以有普通方法

如果一個(gè)類(lèi)繼承了抽象類(lèi),那么這個(gè)類(lèi)必須重寫(xiě)它的抽象方法,或者將類(lèi)聲明為抽象類(lèi)

抽象類(lèi)是有構(gòu)造方法的,但是不能被實(shí)例化。因?yàn)槌橄箢?lèi)中的抽象方法是沒(méi)有方法體的,導(dǎo)致抽象類(lèi)不是一個(gè)完整的類(lèi),因此不允許實(shí)例化。

構(gòu)造方法、類(lèi)方法( static )不能聲明為抽象( abstract )方法

抽象類(lèi)除了不能被實(shí)例化以外,和普通了類(lèi)沒(méi)有區(qū)別。定義抽象類(lèi)是為了強(qiáng)迫子類(lèi)實(shí)現(xiàn)抽象方 法,是定義規(guī)范的

區(qū)別:

①抽象類(lèi)有abstract修飾

②抽象類(lèi)中可以有抽象方法,普通類(lèi)不能有抽象方法,一個(gè)類(lèi)中只要含有抽象方法,這個(gè)類(lèi)就必須是抽象類(lèi),但是抽象類(lèi)不一定含有抽象方法

③抽象類(lèi)不能被實(shí)例化,需要抽象類(lèi)變量引用其子類(lèi)的對(duì)象

2.4 本質(zhì)

上層代碼定義規(guī)范,不用實(shí)現(xiàn)。具體業(yè)務(wù)實(shí)現(xiàn)由子類(lèi)完成,調(diào)用者不用關(guān)心。

2.5 抽象類(lèi)局限

子類(lèi)重寫(xiě)抽象類(lèi)的抽象方法可能會(huì)出現(xiàn)代碼重復(fù)的情況,不符合代碼復(fù)用的要求

3.接口

約定好規(guī)范,然后按照規(guī)范來(lái)做。接口就是定義規(guī)范。

java 中的接口作用和生活中類(lèi)似,它提供一種約定,使實(shí)現(xiàn)接口的類(lèi)在形式上保持一致。

抽象類(lèi)中可以有普通方法而接口中的方法都是抽象的,如果抽象類(lèi)誒中的方法都是抽象方法,可以使用java提供的接口表示,因此也可以將接口看做是一個(gè)特殊的 抽象類(lèi) ,但是采用與抽象類(lèi)完全不同的語(yǔ)法表示,并且兩者的設(shè)計(jì)理念也不同。

接口不能被 實(shí)例化,而且沒(méi)有構(gòu)造方法。

3.1 定義接口

[修飾符] interface 接口名{
	//接口成員
	[public] [static] [final] 數(shù)據(jù)類(lèi)型 成員變量名 = 常量;
	public] [abstract] 返回值類(lèi)型 方法名稱(chēng)([參數(shù)列表]);
}

接口的訪(fǎng)問(wèn)權(quán)限是publicpackage-acces,與類(lèi)的訪(fǎng)問(wèn)權(quán)限類(lèi)似

和抽象類(lèi)不同,定義接口使用interface關(guān)鍵字

接口中的方法默認(rèn)是抽象方法,所以可以省略 abstract 修飾符

接口中的方法默認(rèn)都是 public 的,所以可以省略 public

接口中的變量只能是靜態(tài)常量( static final ),所以可以省略 static final ,靜態(tài)常量在定義時(shí)就要 賦值,且不可變。

一個(gè)接口可以繼承其他接口,被繼承的接口稱(chēng)為父接口。子接口將繼承父接口中聲明的常量和抽象方法

3.2 使用接口

使用接口和使用抽象類(lèi)一樣,都是通過(guò)子類(lèi)。子類(lèi)通過(guò) implements 關(guān)鍵字實(shí)現(xiàn)接口,實(shí)現(xiàn)接口就必須實(shí)現(xiàn) 接口中的抽象方法

public 類(lèi)名 implements 接口名{
    實(shí)現(xiàn)方法
    普通方法
    屬性
}

一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,接口之間使用, 隔開(kāi)

實(shí)現(xiàn)接口的類(lèi)必須實(shí)現(xiàn)接口中定義的所有抽象方法,即使不使用也必須實(shí)現(xiàn)它,通常用空方法體實(shí)現(xiàn)子類(lèi)不需要的抽象方法,如果抽象方法有返回值,可返回默認(rèn)值

接口的實(shí)現(xiàn)類(lèi)中,可以有普通方法

實(shí)現(xiàn)的方法必須是 public 的,因?yàn)橹貙?xiě)方法時(shí),權(quán)限不能縮小,只能大于等于被繼承的方法的訪(fǎng)問(wèn)權(quán)限。

接口與接口之間是繼承關(guān)系,使用 extends 關(guān)鍵字。多個(gè)接口使用 , 隔開(kāi),但是接口不能繼承類(lèi)

3.3 實(shí)現(xiàn)多個(gè)接口

java 中繼承是單繼承,使用 extends 關(guān)鍵字;但是一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,使用 implements ,多個(gè) 接口之間用 , 隔開(kāi)。

一個(gè)類(lèi)可以同時(shí)繼承和實(shí)現(xiàn)接口, extends 要在 implements 之前

3.4 jdk8接口新特性

在 jdk8.0 中 default 關(guān)鍵字可用于在接口中修飾方法(默認(rèn)方法), default 修飾的方法可以有具體 實(shí)現(xiàn),也只能在接口中出現(xiàn)。 default 修飾的方法可以被重寫(xiě)。如果一個(gè)類(lèi)實(shí)現(xiàn)了兩個(gè)接口,這兩個(gè)接口又同時(shí)都包含了一個(gè)同名的default方法,這種情況下編譯器會(huì)報(bào)錯(cuò)。

接口中還可以有 static修飾的方法,稱(chēng)為靜態(tài)方法(類(lèi)方法)。類(lèi)方法可以直接使用接口名.方法名調(diào)用。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot攔截器與文件上傳實(shí)現(xiàn)方法與源碼分析

    SpringBoot攔截器與文件上傳實(shí)現(xiàn)方法與源碼分析

    其實(shí)spring boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要注意下就ok了。本文主要給大家介紹了關(guān)于如何在Springboot實(shí)現(xiàn)登陸攔截器與文件上傳功能,需要的朋友可以參考下
    2022-10-10
  • Spring mvc 實(shí)現(xiàn)用戶(hù)登錄的方法(攔截器)

    Spring mvc 實(shí)現(xiàn)用戶(hù)登錄的方法(攔截器)

    這篇文章主要介紹了Spring mvc 實(shí)現(xiàn)用戶(hù)登錄的方法(攔截器),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 解決java使用axios.js的post請(qǐng)求后臺(tái)時(shí)無(wú)法接收到入?yún)⒌膯?wèn)題

    解決java使用axios.js的post請(qǐng)求后臺(tái)時(shí)無(wú)法接收到入?yún)⒌膯?wèn)題

    今天小編就為大家分享一篇解決java使用axios.js的post請(qǐng)求后臺(tái)時(shí)無(wú)法接收到入?yún)⒌膯?wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • mybatis-plus與JPA混合的使用方式

    mybatis-plus與JPA混合的使用方式

    這篇文章主要介紹了mybatis-plus與JPA混合的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot異步方法捕捉異常詳解

    SpringBoot異步方法捕捉異常詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot異步方法捕捉異常,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java源碼解析Integer方法解讀

    Java源碼解析Integer方法解讀

    這篇文章主要介紹了Java源碼解析Integer方法解讀,包括toString方法、toUnsignedString方法、highestOneBit方法等,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 詳解SpringCloud Zuul過(guò)濾器返回值攔截

    詳解SpringCloud Zuul過(guò)濾器返回值攔截

    Zuul作為網(wǎng)關(guān)服務(wù),是其他各服務(wù)對(duì)外中轉(zhuǎn)站,通過(guò)Zuul進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)。這篇文章主要介紹了詳解SpringCloud Zuul過(guò)濾器返回值攔截,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • SpringBoot遇到的坑@Qualifier報(bào)紅的解決

    SpringBoot遇到的坑@Qualifier報(bào)紅的解決

    這篇文章主要介紹了SpringBoot遇到的坑@Qualifier報(bào)紅的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • springboot項(xiàng)目整合mybatis并配置mybatis中間件的實(shí)現(xiàn)

    springboot項(xiàng)目整合mybatis并配置mybatis中間件的實(shí)現(xiàn)

    這篇文章主要介紹了springboot項(xiàng)目整合mybatis并配置mybatis中間件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java Class 解析器實(shí)現(xiàn)方法示例

    Java Class 解析器實(shí)現(xiàn)方法示例

    這篇文章主要通過(guò)對(duì)class文件的分析,介紹了Java Class 解析器實(shí)現(xiàn)方法示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09

最新評(píng)論

康乐县| 古交市| 泉州市| 兴化市| 卢龙县| 中超| 平湖市| 堆龙德庆县| 巴林左旗| 贡觉县| 黑山县| 磐石市| 陆河县| 南昌县| 莆田市| 慈溪市| 德昌县| 博罗县| 罗定市| 满洲里市| 张掖市| 江西省| 皮山县| 桃江县| 井冈山市| 台北县| 嘉鱼县| 滨州市| 临武县| 鹿邑县| 普安县| 衡阳市| 安仁县| 凤凰县| 延安市| 怀来县| 邛崃市| 塔城市| 玉环县| 寿阳县| 天祝|