Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
636
2022-05-29
Hello,你好呀,我是灰小猿!一個超會寫bug的程序猿!
用堅持締造技術(shù)、用指尖敲動未來!
和很多小伙伴們一樣,我也是一名奔波在Java道路上的“創(chuàng)造者”。也想靠技術(shù)來改未來,改變世界!因為我們堅信每一次敲動鍵盤都能讓生活變得更智能、世界變得更有趣!
在此專欄《Java核心面試寶典》記錄我們備戰(zhàn)夢想的【day 7】!
上一篇文章和大家分享在面向?qū)ο蠓矫娴囊恍┏R娒嬖囶},但是比較多就只分享了在構(gòu)造方法和靜態(tài)實例方面的題目,今天就繼續(xù)來和大家總結(jié)剩下的面試題。
1、靜態(tài)初始化塊和非靜態(tài)初始化塊的執(zhí)行順序是什么?以及分別會執(zhí)行多少次?
靜態(tài)初始化塊的優(yōu)先級最高,會最先執(zhí)行,在非靜態(tài)初始化塊之前執(zhí)行,靜態(tài)初始化塊只在類第一次被加載時執(zhí)行, 非靜態(tài)初始化塊會在每次創(chuàng)建對象時執(zhí)行一次,因此創(chuàng)建了多少個對象,就會執(zhí)行多少次非靜態(tài)初始化塊。
2、靜態(tài)初始化塊和main方法哪個先執(zhí)行?
靜態(tài)初始化塊會在類第一次被加載時執(zhí)行,而main方法是在類中定義的方法,所以靜態(tài)初始化塊會在main方法執(zhí)行之前執(zhí)行。
3、存在繼承關(guān)系的初始化塊的執(zhí)行順序是怎樣的?
如果存在繼承關(guān)系,則在子類進行類加載和創(chuàng)建對象時,也會對父類進行類加載和創(chuàng)建對象,執(zhí)行順序仍然是靜態(tài)初始化塊、非靜態(tài)初始化塊、構(gòu)造器。
如對于兩個類,一個子類一個父類的情況,執(zhí)行順序如下:
執(zhí)行父類的靜態(tài)初始化塊
執(zhí)行子類的靜態(tài)初始化塊
執(zhí)行父類的非靜態(tài)初始化塊
執(zhí)行父類的構(gòu)造器
執(zhí)行子類的非靜態(tài)初始化塊
執(zhí)行子類的構(gòu)造器
對于多個類之間的繼承,執(zhí)行順序如下:
按照從父類到子類的順序,依次執(zhí)行每個類的靜態(tài)初始化塊
按照從父類到子類的順序,對于每個類,依次執(zhí)行非靜態(tài)初始化塊和構(gòu)造器,然后執(zhí)行子類的非靜態(tài)初始化塊和構(gòu)造器,知道所有類執(zhí)行完畢。
可能邏輯性有些有些強,我通過一個實例代碼給大家演示一下:
以下代碼可以說明初始化塊和構(gòu)造器的執(zhí)行順序。代碼中定義了四個類,分別是 Main、Class1、Class2 和 Class3,其中 Class2 是 Class1 的子類,Class3 是 Class2 的子類,每個類都有靜態(tài)初始化塊、非靜態(tài)初始化塊和構(gòu)造器。靜態(tài)方法 main 定義在 Main 中,創(chuàng)建了 Class3 的實例。
public class Main { static { System.out.println("Static initialization of Main"); } { System.out.println("Instance initialization of Main"); } public Test() { System.out.println("Constructor of Main"); } public static void main(String[] args) { new Class3(); } } class Class1 { static { System.out.println("Static initialization of Class1"); } { System.out.println("Instance initialization of Class1"); } Class1() { System.out.println("Constructor of Class1"); } } class Class2 extends Class1 { static { System.out.println("Static initialization of Class2"); } { System.out.println("Instance initialization of Class2"); } Class2() { System.out.println("Constructor of Class2"); } } class Class3 extends Class2 { static { System.out.println("Static initialization of Class3"); } { System.out.println("Instance initialization of Class3"); } Class3() { System.out.println("Constructor of Class3"); } }
由于沒有創(chuàng)建 Main 的實例,因此 Main 的非靜態(tài)初始化塊不會被執(zhí)行,但是由于程序的入口即靜態(tài)方法 main 定義在 Main 中,因此 Main 的靜態(tài)初始化塊首先被執(zhí)行。
在方法 main 中創(chuàng)建了 Class3 的實例,按照父類到子類的順序,依次執(zhí)行每個類的靜態(tài)初始化塊,因此 Class1、Class2 和 Class3 的靜態(tài)初始化塊被依次執(zhí)行。
在所有類的靜態(tài)初始化塊被執(zhí)行之后,按照父類到子類的順序,依次執(zhí)行每個類的非靜態(tài)初始化塊和構(gòu)造器,因此按照 Class1、Class2 和 Class3 的順序,每個類的非靜態(tài)初始化塊和構(gòu)造器被執(zhí)行。
4、關(guān)鍵字this的含義是什么?
關(guān)鍵字this代表當前對象的引用,當前對象指的是調(diào)用類中的屬性或方法的對象。
5、關(guān)鍵字this在方法中以及在構(gòu)造方法中分別表示什么?
關(guān)鍵字this可以用于引用對象的屬性,在方法和構(gòu)造方法中都可以通過關(guān)鍵字this來引用對象的屬性,在構(gòu)造方法中,通過this還可以引用其他的構(gòu)造方法。
6、關(guān)鍵字this是否可以在靜態(tài)方法中使用?說明理由!
關(guān)鍵字this不可以在靜態(tài)方法中使用,因為關(guān)鍵字this代表的是對象的引用,而靜態(tài)方法不依賴于類的具體對象。
7、如果類成員不加任何修飾符,可以從哪里訪問到該類成員?
不加任何可見性的修飾符為默認修飾符,在同一個包下的任何類都可以訪問。
8、可見性修飾符public和private分別表示可以從哪里訪問類成員?
可見性修飾符public表示可以從任何類中訪問,可見性修飾符private表示類成員只能從自身所在的類中訪問。
9、什么是數(shù)據(jù)域封裝?為什么要使用數(shù)據(jù)域封裝?
數(shù)據(jù)域封裝是對數(shù)據(jù)域使用private修飾符,將數(shù)據(jù)域聲明為私有域,使用數(shù)據(jù)域封裝的目的是避免從類的外部直接修改數(shù)據(jù)域的值。
10、在使用數(shù)據(jù)域之后,應(yīng)如何讀取和修改數(shù)據(jù)域的值?
可以編寫get方法獲取數(shù)據(jù)域的值,編寫set方法修改數(shù)據(jù)域的值。
11、String類型的值是否可變?對String類型的值進行修改操作是否修改了String的內(nèi)容?
由于String源碼中,存儲字符串內(nèi)容的數(shù)組使用關(guān)鍵字final修飾的,因此String類型的值不可變,對String類型的值進行修改沒有修改String的內(nèi)容,而是創(chuàng)建了新的String對象。
補充:關(guān)于String類型的值不能修改的原因還有另外一種說法,因為我們知道final修飾的數(shù)組的value內(nèi)容有時候也是可以修改的,只是value不能指向其他的數(shù)組對象,具體為什么不能修改,其實是因為String中存儲字符串內(nèi)容的數(shù)組是private類型的,并且String類中并沒有對外提供修改內(nèi)容的方法,所以字符串對象才無法修改。
12、StringBuffer 和 StringBuilder 哪一種類型的效率更高?兩種類型分別適用于什么樣的場合?
StringBuilder 的效率更高,因為 StringBuffer對方法加了同步鎖,而 StringBuilder沒有對方法加同步鎖。雖然StringBuilder 的效率更高,但是因為沒有對方法加同步鎖,因此在多線程環(huán)境下不保證線程安全,只適合單線程環(huán)境,而 StringBuffer 可以用于多線程環(huán)境。
今日總結(jié)
今天和大家總結(jié)了在面向?qū)ο蟮目疾禳c上一些常見的面試題,在這一篇中我們需要掌握初始化塊的調(diào)用順序、this關(guān)鍵字的使用、三種修飾符的作用范圍以及字符串的三個常用操作類String、StringBuilder、StringBuffer。
面向?qū)ο蟮拿嬖囶}比較多,之后還會繼續(xù)總結(jié),如果小伙伴們有遇到其他相關(guān)的面試題,歡迎在評論區(qū)留言提出,==我會把大家提出的總結(jié)到文章內(nèi)==, 歡迎小伙伴們一起評論區(qū)打卡學習!小伙伴們可也在左方加我好友一起探討學習!
我是==灰小猿==,我們下期見!
Java 面向?qū)ο缶幊?/p>
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。