Java語(yǔ)言繼承的要點(diǎn)
導(dǎo)語(yǔ):Java中的繼承作為Java面向?qū)ο笕筇匦灾,在知識(shí)點(diǎn)上而言,還是很多的。下面讓我們一起來(lái)學(xué)習(xí)吧!
1. 繼承的概念:
繼承在本職上是特殊——一般的關(guān)系,即常說(shuō)的is-a關(guān)系。子類(lèi)繼承父類(lèi),表明子類(lèi)是一種特殊的父類(lèi),并且具有父類(lèi)所不具有的一些屬性或方法。
2. 繼承中的初始化順序:
從類(lèi)的結(jié)構(gòu)上而言,其內(nèi)部可以有如下四種常見(jiàn)形態(tài):屬性(包括類(lèi)屬性和實(shí)例屬性)、方法(包括類(lèi)方法和實(shí)例方法)、構(gòu)造器和初始化塊(包括類(lèi)的初始化塊和實(shí)例的初始化塊)。對(duì)于繼承中的初始化順序,又具體分為類(lèi)的初始化和對(duì)象的初始化。
類(lèi)初始化:
在jvm裝載類(lèi)的準(zhǔn)備階段,首先為類(lèi)的所有類(lèi)屬性和類(lèi)初始化塊分配內(nèi)存空間。并在類(lèi)首次初始化階段中為其進(jìn)行初始化,類(lèi)屬性和類(lèi)初始化塊之間的定義時(shí)的順序決定了其初始化的順序。若類(lèi)存在父類(lèi),則首先初始化父類(lèi)的類(lèi)屬性和類(lèi)初始化塊,一直上溯到Object類(lèi)最先執(zhí)行。
對(duì)象初始化:
在new創(chuàng)建對(duì)象時(shí),首先對(duì)對(duì)象屬性和初始化塊分配內(nèi)存,并執(zhí)行默認(rèn)初始化。如果存在父類(lèi),則先為父類(lèi)對(duì)象屬和初始化塊先分配內(nèi)存并執(zhí)行初始化。
然后執(zhí)行父類(lèi)構(gòu)造器中的初始化程序,接著才開(kāi)始對(duì)子類(lèi)的對(duì)象屬性和初始化塊執(zhí)行初始化。
注:
1. 在對(duì)象初始化階段,屬性和方法均針對(duì)子類(lèi)可以從父類(lèi)繼承過(guò)來(lái)的屬性和方法而言,一般而言,都是針對(duì)父類(lèi)中非private而言的。
因?yàn)閜rivate修飾的為父類(lèi)所特有的,子類(lèi)沒(méi)有繼承過(guò)來(lái),當(dāng)new子類(lèi)時(shí),無(wú)須為其分配空間并執(zhí)行初始化。當(dāng)然了,父類(lèi)的構(gòu)造器子類(lèi)也是不繼承過(guò)來(lái)的,
但構(gòu)造器另當(dāng)別論。
2. 類(lèi)的初始化只執(zhí)行一次,當(dāng)對(duì)同一個(gè)類(lèi)new多個(gè)對(duì)象時(shí),類(lèi)屬性和類(lèi)初始化塊只初始化一次。
3.繼承中的隱藏:
隱藏含義:實(shí)際上存在,但是對(duì)外不可見(jiàn)。
Java類(lèi)具有三種訪問(wèn)控制符:private、protected和public,同時(shí)當(dāng)不寫(xiě)這三個(gè)訪問(wèn)控制符時(shí),表現(xiàn)為一種默認(rèn)的訪問(wèn)控制狀態(tài)。因此,一共具有四種訪問(wèn)控制級(jí)別。
具體訪問(wèn)控制表現(xiàn)如下:
private修飾的屬性或方法為該類(lèi)所特有,在任何其他類(lèi)中都不能直接訪問(wèn);
default修飾的屬性或方法具有包訪問(wèn)特性,同一個(gè)包中的其他類(lèi)可以訪問(wèn);
protected修飾的屬性或方法在同一個(gè)中的其他類(lèi)可以訪問(wèn),同時(shí)對(duì)于不在同一個(gè)包中的子類(lèi)中也可以訪問(wèn);
public修飾的屬性或方法外部類(lèi)中都可以直接訪問(wèn)。
當(dāng)子類(lèi)繼承父類(lèi),子類(lèi)可以繼承父類(lèi)中具有訪問(wèn)控制權(quán)限的屬性和方法(一般來(lái)說(shuō)是非private修飾的),對(duì)于private修飾的父類(lèi)所特有的屬性和方法,子類(lèi)是不繼承過(guò)來(lái)的。
當(dāng)子類(lèi)需要改變繼承過(guò)來(lái)的方法時(shí),也就是常說(shuō)的重寫(xiě)父類(lèi)的方法。一旦重寫(xiě)后,父類(lèi)的此方法對(duì)子類(lèi)來(lái)說(shuō)表現(xiàn)為隱藏。以后子類(lèi)的對(duì)象調(diào)用此方法時(shí),都是調(diào)用子類(lèi)重寫(xiě)后的方法,但子類(lèi)對(duì)象中想調(diào)用父類(lèi)原來(lái)的此方法時(shí),可以通過(guò)如下兩種方式:
1.將子類(lèi)對(duì)象類(lèi)型強(qiáng)制轉(zhuǎn)化為父類(lèi)類(lèi)型,進(jìn)行調(diào)用;
2.通過(guò)super調(diào)用。
同樣的,如果在子類(lèi)中定義父類(lèi)中相同名稱的屬性時(shí),父類(lèi)屬性在子類(lèi)中表現(xiàn)為隱藏。
4.繼承中的this和super:
構(gòu)造器中的this表示當(dāng)前正在初始化的對(duì)象引用,方法中的this表示當(dāng)前正在調(diào)用此方法的對(duì)象引用。this具體用法表現(xiàn)在一下幾個(gè)方面:
1.當(dāng)具多個(gè)重載的構(gòu)造器時(shí),且一個(gè)構(gòu)造器需要調(diào)用另外一個(gè)構(gòu)造其,在其第一行使用this(param)形式調(diào)用,且只能在第一行;
2.當(dāng)對(duì)象中一個(gè)方法需要調(diào)用本對(duì)象中其他方法時(shí),使用this作為主調(diào),也可以不寫(xiě),實(shí)際上默認(rèn)就是this作為主調(diào);
3.當(dāng)對(duì)象屬性和方法中的局部變量名稱相同時(shí),在該方法中需要顯式的使用this作為主調(diào),以表示對(duì)象的屬性,若不存在此問(wèn)題,可以不顯式的寫(xiě)this。
其實(shí),其牽涉到的一個(gè)問(wèn)題就是變量的查找規(guī)則:先局部變量 => 當(dāng)前類(lèi)中定義的變量 => 其父類(lèi)中定義的可以被子類(lèi)繼承的變量 => 父類(lèi)...
super表示調(diào)用父類(lèi)中相應(yīng)的屬性和方法。在方法中,若需要調(diào)用父類(lèi)的方法時(shí),也一定要寫(xiě)在第一行
5. 繼承與組合:
從單純的實(shí)現(xiàn)效果上看,繼承和組合都能達(dá)到同樣的目的。并且都是實(shí)現(xiàn)代碼復(fù)用的有效方式。
但在一般性的概念層次中,兩者具有較為明顯的差別。
繼承表現(xiàn)為一般——特殊的關(guān)系,子類(lèi)是一個(gè)特殊的父類(lèi),是is-a的關(guān)系。父類(lèi)具有所有子類(lèi)的一般特性。
組合表現(xiàn)為整體——部分關(guān)系,即has-a關(guān)系。在組合中,通過(guò)將“部分”單獨(dú)抽取出來(lái),形成自己的類(lèi)定義,并且在“整體”
這個(gè)類(lèi)定義中,將部分定義為其中的一個(gè)屬性,并通過(guò)get和set方法,以此可以調(diào)用“部分”類(lèi)中的屬性和方法。
【Java語(yǔ)言繼承的要點(diǎn)】相關(guān)文章:
java語(yǔ)言的接口與繼承09-09
Java語(yǔ)言的繼承結(jié)構(gòu)06-21
學(xué)好Java語(yǔ)言的要點(diǎn)06-22
Java 繼承07-04
Java語(yǔ)言學(xué)習(xí)的要點(diǎn)10-30
Java語(yǔ)言接口與繼承的本質(zhì)是什么06-29
java的繼承總結(jié)08-06
Java中的繼承與組合09-20