在這里記錄一下自己回顧Java基礎(chǔ)時(shí)屋讶,一些覺得掌握的還不牢固的基礎(chǔ)知識(shí)朋沮,查漏補(bǔ)缺菊卷!
Java程序初始化順序
三個(gè)原則
- 靜態(tài)對(duì)象優(yōu)先于非靜態(tài)對(duì)象毯盈,靜態(tài)對(duì)象只會(huì)初始化一次
- 父類優(yōu)先于子類
- 成員變量則是根據(jù)定義的順序進(jìn)行初始化
各種代碼塊的初始化順序則如下:
- 父類靜態(tài)變量剃毒,靜態(tài)代碼塊
- 子類靜態(tài)變量,子類靜態(tài)代碼塊
- 父類費(fèi)靜態(tài)變量搂赋,代碼塊
- 父類構(gòu)造方法
- 子類非靜態(tài)變量赘阀,代碼塊
- 子類構(gòu)造方法
Java對(duì)象的作用域
成員變量:作用范圍與類的實(shí)例對(duì)象的作用范圍相同
靜態(tài)變量:只要一個(gè)類被加載,jvm就會(huì)給該類的靜態(tài)變量分配存儲(chǔ)空間
局部變量:僅限于該類所在的花括號(hào)內(nèi)
構(gòu)造方法
當(dāng)父類沒有提供無參的構(gòu)造方法時(shí)脑奠,子類的構(gòu)造方法中必須顯式的調(diào)用父類的構(gòu)造方法基公;
當(dāng)提供了無參構(gòu)造方法,則無需顯式調(diào)用捺信,因?yàn)榫幾g器會(huì)默認(rèn)調(diào)用父類無參構(gòu)造方法酌媒;
在實(shí)例化對(duì)象時(shí),先執(zhí)行父類的構(gòu)造方法迄靠,然后才是子類
clone方法的理解
- 首先,為什么會(huì)有該方法喇辽?
這里涉及到Java方法的兩種傳遞參數(shù)方式:
處理基本數(shù)據(jù)類型時(shí)掌挚,采用的是按值傳遞;
此外菩咨,當(dāng)處理其他數(shù)據(jù)類型時(shí)吠式,都是采用的按引用傳遞,包括在使用“=”賦值時(shí)也是如此
這樣就會(huì)導(dǎo)致一個(gè)問題:當(dāng)需要?jiǎng)?chuàng)建一個(gè)和當(dāng)前已有對(duì)象相同的對(duì)象抽米,又需要對(duì)其中一個(gè)的修改不會(huì)影響到另一個(gè)對(duì)象時(shí)特占,使用一般的賦值操作顯然無法達(dá)到該目的,因此提供了clone方法來提供這個(gè)能力
- 如何實(shí)現(xiàn)clone方法云茸?
在將這個(gè)之前是目,先看兩個(gè)概念:
淺復(fù)制:被復(fù)制的對(duì)象的所有變量都和原來的對(duì)象有相同的值,而所有對(duì)其他對(duì)象的引用仍然指向其原來的對(duì)象标捺;
深復(fù)制:會(huì)將原對(duì)象所有引用的對(duì)象全都復(fù)制一遍
下面看如何實(shí)現(xiàn)clone方法:
- 使目標(biāo)類實(shí)現(xiàn)Cloneable接口懊纳,該接口中沒有任何方法,只是一個(gè)標(biāo)識(shí)接口
- 重寫clone()方法
- 在該方法中返回super.clone()亡容,也就是會(huì)調(diào)用至Object的clone方法
上面是淺復(fù)制的實(shí)現(xiàn)方法嗤疯,若需實(shí)現(xiàn)深復(fù)制,則需要對(duì)對(duì)象中的非基本類型數(shù)據(jù)都調(diào)用clone方法闺兢;
注意茂缚,這里需要這些屬性所屬類全都實(shí)現(xiàn)clone方法才行
組合和繼承
繼承:is-a的關(guān)系
組合: has-a關(guān)系
能使用就盡量不要使用繼承
多態(tài)
Java中的多態(tài)主要表現(xiàn)為兩種方式:
- 方法的重載overload:編譯時(shí)多態(tài),在編譯期間就可以確定調(diào)用哪一個(gè)方法
- 覆蓋override:運(yùn)行時(shí)多態(tài),只有在運(yùn)行時(shí)脚囊,才可以確定內(nèi)存中實(shí)例化的是哪一個(gè)對(duì)象
這里需要注意:只有方法才有多態(tài)的概念帖汞,類中的成員變量并沒有方法的概念,因?yàn)槌蓡T變量是在編譯期間就確定了的凑术;
因此翩蘸,成員變量的取值為new對(duì)象定義的類型的值
舉例如下:
BaseClass b = new SubClass()
假設(shè)sub是base的子類,這時(shí)打印b.age淮逊,此時(shí)打印出的是base中定義的值而非sub定義
接口與抽象類
接口催首,強(qiáng)調(diào)功能的特定實(shí)現(xiàn),是has-a的關(guān)系
抽象類泄鹏,強(qiáng)調(diào)所屬關(guān)系郎任,是is-a的關(guān)系
static代碼塊常用來初始化靜態(tài)變量
switch支持string類型,其實(shí)也是先判斷字符串的hashcode是否相同备籽,若相同舶治, 再調(diào)用equals方法進(jìn)行匹配
volatile
可以提供可見性,部分有序性车猬,但是無法保證原子性霉猛,因此其還是無法替代synchronized關(guān)鍵字
按值傳遞與引用傳遞
- 值傳遞:原始數(shù)據(jù)類型,會(huì)擁有不同的存儲(chǔ)空間珠闰,對(duì)參數(shù)的修改不會(huì)影響到原值
- 引用傳遞:傳遞的是對(duì)象的地址惜浅,二者指向同一內(nèi)存地址,對(duì)形參的修改會(huì)影響到實(shí)參
Java的異常處理用到了多態(tài)的概念伏嗜,在進(jìn)行異常捕獲時(shí)坛悉,如果需要捕獲多個(gè),應(yīng)該先捕獲子類承绸,再捕獲基類裸影;
否則若順序相反,子類異常就不會(huì)被捕獲到了