漫談程序員(十八)淺談谷歌用戶體驗(yàn)設(shè)計(jì)準(zhǔn)則
894
2025-03-31
前言
類的加載順序?yàn)椋?/p>
(1)初始化變量。對于靜態(tài)變量肯定要首先進(jìn)行初始化,因?yàn)楹竺娴姆椒赡軙褂眠@個(gè)變量,或者構(gòu)造函數(shù)中也可能用到。而對于非靜態(tài)變量而言,由于匿名塊內(nèi)、非靜態(tài)方法和構(gòu)造函數(shù)都可以進(jìn)行操作(不僅僅是初始化),所以要提前進(jìn)行加載和賦默認(rèn)值。
(2)初始化靜態(tài)代碼塊,多個(gè)靜態(tài)代碼塊按順序加載,這里需要注意:在這個(gè)順序是類內(nèi)書寫的順序,也是類加載的順序.由于靜態(tài)代碼塊可能會負(fù)責(zé)變量的初始化,或者是對象等的初始化,這樣在構(gòu)造函數(shù)或者方法中就變得可用了。
(3)匿名代碼塊,這個(gè)要后初始化于靜態(tài)代碼塊,因?yàn)槠湟廊粚儆趯?shí)例對象,而不屬于類。在這里可以對非靜態(tài)成員變量進(jìn)行初始化工作。
(4)構(gòu)造函數(shù) 這里需要解釋一下,為什么初始化子類必先初始化父類,由于子類可能會繼承父類的屬性或方法,所以肯定要先初始化父類了,而初始化父類則必須要調(diào)用父類的構(gòu)造函數(shù)。
至于方法不用考慮,因?yàn)榉椒ú挥贸跏蓟?
1.final
1)修飾類 該類不能被繼承(在實(shí)際開發(fā)過程中盡量少使用final修飾類,因?yàn)橄到y(tǒng)要具備可擴(kuò)展性和可維護(hù)性)
2)使用final修飾方法,方法不能被重寫
3)final 修飾屬性:被final修飾的屬性必須初始化,初始化之后值不能改變(屬性為簡單類型時(shí)是值不變;屬性為引用類型時(shí)是地址不變,其指向的對象的屬性可以改變)
4)final修飾變量:
修飾方法的形參,該參數(shù)只能讀不能寫
修飾局部變量,一般在內(nèi)部類使用(可以先定義,再賦值一次)
5)final定義常量:
public static final 類型 變量名 =值
2.static關(guān)鍵字
1)static 修飾屬性
被static修飾的屬性,是屬于類級別的屬性。他被該類所產(chǎn)生的對象所共有
1))靜態(tài)屬性的訪問方式
類的外部:類名。屬性名
類的內(nèi)部:屬性名即可,等價(jià)于類名。屬性名
注:靜態(tài)屬性可以被非靜態(tài)的方法和靜態(tài)的方法中直接訪問
2)static修飾方法:
被static修飾的方法,是屬于類級別的方法。他是該類所產(chǎn)生的所有的對象所共享的方法
1))靜態(tài)方法的訪問方式:
類名。方法名(參數(shù)),適用于類的內(nèi)部和類的外部
方法名(參數(shù)),適用于類的內(nèi)部
注:
a.靜態(tài)方法調(diào)用屬性,只能直接調(diào)用靜態(tài)屬性,非靜態(tài)的屬性只能通過對象引用才能調(diào)用
b.靜態(tài)方法調(diào)用方法,只能直接調(diào)用靜態(tài)方法,非靜態(tài)的方法只能通過對象引用才能調(diào)用
c.在靜態(tài)方法中,不能使用this,super調(diào)用屬性和方法(構(gòu)造器不能使用static修飾);原因是靜態(tài)的方法先于非靜態(tài)的屬性和非靜態(tài)的方法加載;具體參考下面的代碼分析。
d.非靜態(tài)的方法可直接調(diào)用講臺的方法和靜態(tài)的屬性
3)static靜態(tài)塊:
在類體中:
static {
代碼
}
注:static塊只能在類體中定義,不能在方法中定義
1))執(zhí)行方式:
static 塊是在類加載時(shí),該語句就會被執(zhí)行;且此語句只能被執(zhí)行一次(因?yàn)椋侯惒捎玫膽屑虞d的方式,也就是說,如果內(nèi)存中的方法區(qū)已存在該類的代碼,那么就不會加載第二次;如果內(nèi)存中不存在代碼就會被加載,同時(shí)靜態(tài)塊也會被執(zhí)行)
注:java命令找到帶有mian方法的類,通過類加載器該類加載到方法區(qū)
靜態(tài)域:存放靜態(tài)屬性、靜態(tài)方法和靜態(tài)塊。
2))應(yīng)用場景:
加載配置文件,也可使用于只需加載一次的資源(如:讀取文件,加載數(shù)據(jù)庫驅(qū)動(dòng))
3))static修飾類(內(nèi)部類)
語法:
static class 類名{
類體
}
1))特性:
1)))在靜態(tài)內(nèi)部類中訪問外部類的成員,該成員必須是static的;可以使用外部類的對象引用來訪問外部類的非靜態(tài)成員
2)))靜態(tài)內(nèi)部類的實(shí)例化方式:
外部類類名。內(nèi)部類類名 變量名 =new 外部類類名。內(nèi)部類類名(參數(shù)列表);
3)))靜態(tài)內(nèi)部類可被四大訪問控制修飾符所修飾
4)))靜態(tài)內(nèi)部類可直接調(diào)用外部類的靜態(tài)方法;也可以使用外部了引用來調(diào)用非靜態(tài)的方法
5)))外部類訪問靜態(tài)內(nèi)部類的靜態(tài)方法:
外部類類名。方法名
外部類訪問內(nèi)部類的FAI靜態(tài)方法:內(nèi)部類引用。方法名;
4)代碼示例分析:
Joo.run(參數(shù)類表);
分析:
1))檢查Joo是否存在代碼區(qū)
2))若存在代碼區(qū),就不加載Joo代碼。若不存在,就將Joo的代碼加載到方法區(qū)中。
將被static修飾的屬性、方法和靜態(tài)塊放置到靜態(tài)域中,將普通方法放置在普通方法區(qū)中。
3))當(dāng)Joo的代碼加載完畢之后,立即執(zhí)行static塊;
4))通過Joo的地址在靜態(tài)域中找到run方法,并且執(zhí)行run方法。
Joo J=new Joo(參數(shù)類表);
1))檢查J00在代碼區(qū)是否存在
2))若存在,就直接在堆區(qū)中開辟空間,并將非靜態(tài)的屬性以及非靜態(tài)的方法引用存在堆區(qū)中。
3))在棧區(qū)開辟空間,記錄堆區(qū)對象地址。
Joo.print(參數(shù)類表);
1))通過棧區(qū)引用的地址,找到堆區(qū)中的方法的地址,然后再在方法區(qū)找到方法,并執(zhí)行。
總結(jié)
創(chuàng)建一個(gè)不可變類(不可變類是指當(dāng)創(chuàng)建了這個(gè)類的實(shí)例后,就不允許修改它的屬性值)需要如下條件:
1. 對于一般成員都是private,還可以使用public static final 來定義一個(gè)全局的常量。
2. 不提供對成員的修改方法,例如:setXXX()
3. 確保所有的方法不會被重載。手段有兩種:使用final Class(強(qiáng)不可變類),或者將所有的類方法加上final關(guān)鍵字(弱不可變類)。
4. 如果某一個(gè)類成員不是原始變量(primitive)或者不可變類,必須通過在成員初始化或者get方法時(shí)通過深度clone方法,來確保類的不可變。
Java
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。