继承 抽象 接口 多态
1.?繼承
概述
繼承就是子類(lèi)繼承父類(lèi)的屬性和行為,子類(lèi)可以直接訪問(wèn)父類(lèi)的非私有方法
Java語(yǔ)言是單繼承 多級(jí)繼承 一個(gè)父類(lèi)可以有多個(gè)子類(lèi)
提高了代碼的復(fù)用性,類(lèi)與類(lèi)之間產(chǎn)生了關(guān)系,是多態(tài)的前提
繼承中方法的覆蓋重寫(xiě)(聲明不變,重新實(shí)現(xiàn))
父子類(lèi)之間方法,參數(shù)列表相同
子類(lèi)方法權(quán)限大于等于父類(lèi)
子類(lèi)方法的返回值范圍小于等于父類(lèi)方法的返回值
大部分情況下,方法子父類(lèi)方法聲明是完全一樣的
繼承中構(gòu)造方法的訪問(wèn)
構(gòu)造方法名與類(lèi)名一致,所以子類(lèi)無(wú)法繼承父類(lèi)構(gòu)造
構(gòu)造方法用于初始化成員變量,子類(lèi)的初始化過(guò)程中,須先執(zhí)行父類(lèi)的初始化動(dòng)作
父類(lèi)成員變量初始化后,才可以給子類(lèi)使用
所以子類(lèi)構(gòu)造必須調(diào)用父類(lèi)構(gòu)造,不寫(xiě)則默認(rèn)贈(zèng)送super( ); 寫(xiě)了則不贈(zèng)送
子類(lèi)構(gòu)造可以通過(guò)super關(guān)鍵字調(diào)用父類(lèi)重載構(gòu)造
子類(lèi)構(gòu)造中,super構(gòu)造調(diào)用只能有一個(gè)且必須是第一個(gè)
只有子類(lèi)構(gòu)造才能調(diào)用父類(lèi)構(gòu)造,子類(lèi)成員方法不能調(diào)用父類(lèi)構(gòu)造
繼承中成員變量,成員方法的訪問(wèn)
與多態(tài)完全一樣
成員變量:編譯看左,運(yùn)行看左
成員方法:編譯看左,運(yùn)行看右
super在繼承中的用法 ?
代表父類(lèi)的存儲(chǔ)空間標(biāo)識(shí)(可以理解為父親的引用)
子類(lèi)成員方法中訪問(wèn)父類(lèi)的成員變量,方法
子類(lèi)構(gòu)造訪問(wèn)父類(lèi)構(gòu)造 super( );
this在繼承中的用法
代表當(dāng)前對(duì)象的引用(誰(shuí)調(diào)用就代表誰(shuí))
本類(lèi)成員方法中訪問(wèn)本類(lèi)成員變量,成員方法
本類(lèi)構(gòu)造訪問(wèn)本類(lèi)另一構(gòu)造
this調(diào)用也必須是構(gòu)造方法的第一個(gè)語(yǔ)句
this和super兩個(gè)構(gòu)造調(diào)用不可同時(shí)使用
this( ); 沒(méi)有 .
繼承圖解
創(chuàng)建子類(lèi)對(duì)象時(shí),先初始化父類(lèi)空間,再創(chuàng)建其子類(lèi)對(duì)象本身
先把父類(lèi)構(gòu)造執(zhí)行完,再在這個(gè)父類(lèi)內(nèi)容的外圍寫(xiě)上子類(lèi)內(nèi)容
2.?抽象
概述
子類(lèi)們重寫(xiě)父類(lèi)方法,而子類(lèi)各自的實(shí)現(xiàn)都不盡相同
則父類(lèi)方法聲明和方法主體,聲明有意義,而方法主體沒(méi)有意義
沒(méi)有方法主體的方法稱(chēng)為抽象方法,用abstract修飾
包含抽象方法的類(lèi)就是抽象類(lèi),用abstract修飾
注意
繼承抽象類(lèi)的子類(lèi)須重寫(xiě)父類(lèi)所有抽象方法,否則該子類(lèi)也必須聲明為抽象類(lèi)
抽象類(lèi)不能創(chuàng)建對(duì)象,只能創(chuàng)建非抽象子類(lèi)的對(duì)象
抽象類(lèi)有構(gòu)造方法,供子類(lèi)創(chuàng)建對(duì)象時(shí),初始化父類(lèi)空間使用
不一定包含抽象方法,但是有抽象方法的類(lèi)必定是抽象類(lèi)
3.?接口
概述
接口是Java語(yǔ)言中一種引用類(lèi)型,是方法的集合
接口的作用是制定規(guī)則,實(shí)現(xiàn)擴(kuò)展
如果說(shuō)類(lèi)的內(nèi)部封裝了成員變量,構(gòu)造方法和成員方法,那么接口的內(nèi)部主要就是封裝了方法
接口定義用interface,也會(huì)被編譯成.class文件,但要明確它不是類(lèi),而是引用數(shù)據(jù)類(lèi)型
接口不能創(chuàng)建對(duì)象,但可以被實(shí)現(xiàn)(implements,類(lèi)似繼承),接口實(shí)現(xiàn)類(lèi)需實(shí)現(xiàn)接口所有方法
類(lèi)是單繼承的,接口是可以多實(shí)現(xiàn)的(一個(gè)類(lèi)實(shí)現(xiàn)多個(gè)接口)
Java7抽象方法 ?/ ?Java8默認(rèn)方法,靜態(tài)方法 ?/ ?Java9私有方法(靜態(tài)/默認(rèn))
接口中的常量
(public static final) 數(shù)據(jù)類(lèi)型 變量名 = 值;
接口常量必須賦值,否則無(wú)法通過(guò)編譯
命名規(guī)則:全大寫(xiě) _連接 (NUM_OF_PEOPLE)
通過(guò) 接口名.常量名 直接訪問(wèn)
接口中的抽象方法:固定修飾符?public ?abstract?可省略
接口中的默認(rèn)方法
解決接口升級(jí)問(wèn)題
如果接口如添加新的抽象方法,則所有實(shí)現(xiàn)類(lèi)都須實(shí)現(xiàn)此抽象方法
若直接在接口中添加默認(rèn)方法,則實(shí)現(xiàn)類(lèi)代碼不用更改
可以直接通過(guò)接口名稱(chēng).默認(rèn)方法名稱(chēng)來(lái)調(diào)用接口的默認(rèn)方法
defaul關(guān)鍵字不能省略(因?yàn)榻涌谥械姆椒J(rèn)是public的)
接口默認(rèn)方法可被繼承,也可重寫(xiě),但只能通過(guò)實(shí)現(xiàn)類(lèi)對(duì)象調(diào)用
接口中的靜態(tài)方法
靜態(tài)與.class文件相關(guān)
一個(gè)類(lèi)可實(shí)現(xiàn)多個(gè)接口,它們的靜態(tài)方法可能沖突
所以應(yīng)通過(guò) 接口名稱(chēng).方法名( ) 調(diào)用靜態(tài)方法,不能通過(guò)實(shí)現(xiàn)類(lèi)對(duì)象調(diào)用
接口中的私有方法
解決接口中多個(gè)默認(rèn)方法和靜態(tài)方法之間的代碼重復(fù)問(wèn)題
多個(gè)默認(rèn)方法之間有重復(fù)的代碼,用一個(gè)共有方法將其抽取出來(lái)
但這個(gè)共有方法不能讓實(shí)現(xiàn)類(lèi)訪問(wèn)到,應(yīng)該是私有化的,這就是私有方法
普通私有方法:多個(gè)默認(rèn)方法代碼重復(fù)(修飾符只有private,加default報(bào)錯(cuò),因?yàn)闄?quán)限沖突)
靜態(tài)私有方法:多個(gè)靜態(tài)方法代碼重復(fù)(private和static順序無(wú)所謂)
注意事項(xiàng)
1.接口沒(méi)有靜態(tài)代碼塊或者構(gòu)造方法
2.實(shí)現(xiàn)類(lèi)所實(shí)現(xiàn)的多個(gè)接口存在重復(fù)的抽象方法,只需覆蓋重寫(xiě)一次即可
3.實(shí)現(xiàn)類(lèi)所實(shí)現(xiàn)的多個(gè)接口存在重復(fù)的默認(rèn)方法,則實(shí)現(xiàn)類(lèi)必須對(duì)沖突的默認(rèn)方法進(jìn)行覆蓋重寫(xiě)
4.父類(lèi)和接口的默認(rèn)方法沖突,優(yōu)先用父類(lèi)的方法
5.接口之間的多繼承,多個(gè)父接口中的抽象方法重復(fù),沒(méi)關(guān)系
6.多個(gè)父接口中的默認(rèn)方法重復(fù),子接口必須覆蓋重寫(xiě)此默認(rèn)方法,且?guī)е鴇efault
4.?多態(tài)
概述
指同一行為,在不同對(duì)象身上的多種表現(xiàn)形式
面向?qū)ο笕筇卣?: 封裝 繼承 多態(tài)
多態(tài)的前提:1.繼承/實(shí)現(xiàn) 2.方法的重寫(xiě) 3.父類(lèi)引用指向子類(lèi)對(duì)象
格式:父類(lèi)名稱(chēng) 對(duì)象名 = ?new ?子類(lèi)名稱(chēng)( );
多態(tài)的意義
無(wú)論右邊new的是哪個(gè)子類(lèi)對(duì)象,左邊都不變,代碼統(tǒng)一
實(shí)現(xiàn)父類(lèi)的引用動(dòng)態(tài)的調(diào)用子類(lèi)的功能
有良好的擴(kuò)展性
弊端是無(wú)法使用子類(lèi)的特有內(nèi)容
多態(tài)成員變量,成員方法的訪問(wèn)
與繼承完全一樣
成員變量:編譯看左,運(yùn)行看左
成員方法:編譯看左,運(yùn)行看右
向上轉(zhuǎn)型
其實(shí)就是多態(tài)寫(xiě)法
格式:父類(lèi)名稱(chēng) 對(duì)象名 = ?new 子類(lèi)名稱(chēng)( );
含義:創(chuàng)建一個(gè)子類(lèi)對(duì)象,把它當(dāng)作父類(lèi)來(lái)看待使用
向上轉(zhuǎn)型一定是安全的,從小范圍轉(zhuǎn)向了大范圍
對(duì)象一旦向上轉(zhuǎn)型為父類(lèi),則無(wú)法調(diào)用子類(lèi)特有方法
類(lèi)似于基本類(lèi)型的自動(dòng)類(lèi)型轉(zhuǎn)換
向下轉(zhuǎn)型
作用:解決多態(tài)的弊端 (無(wú)法使用子類(lèi)的特有內(nèi)容)
格式:子類(lèi)名稱(chēng) 對(duì)象名 = (子類(lèi)名稱(chēng)) 父類(lèi)對(duì)象;
含義:將父類(lèi)對(duì)象,還原成本來(lái)的子類(lèi)對(duì)象
向下轉(zhuǎn)型須原路返回,否則編譯通過(guò),但運(yùn)行報(bào)錯(cuò)
類(lèi)似于基本類(lèi)型的強(qiáng)制類(lèi)型轉(zhuǎn)換
向下轉(zhuǎn)型之前用instanceof 判斷一下
Instanceof 方法
對(duì)象名 instanceof 類(lèi)名/數(shù)據(jù)類(lèi)型 :返回一個(gè)boolean值
轉(zhuǎn)載于:https://www.cnblogs.com/bushishucai/p/9631691.html
總結(jié)
以上是生活随笔為你收集整理的继承 抽象 接口 多态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。