Java類的初始化和實例化(面試踩坑學習與記錄)

背景

疫情期間,公司半年沒發工資了,不得已選擇了辭職,休息了一陣子,開始找工作。沒有優秀的學歷,也沒有優秀的背景履歷,加上現在企業也不好做,疫情的影響導致現在形成了賣方市場,這期間的求職之路還真是舉步維艱啊,能做的只能是一步一個腳印,踏實學習,擺脫了加班以及業務的催促,也趁這期間好好沉澱自己,相信沒有邁不過去的坎兒,會好的。

從今天開始如果有面試,有被問到不會的或者答的不好的問題,我會在此記錄下來,算是一次回顧學習與總結,同時也是對自己的鞭策,找到自己的弱項,針對其進行提升。

java類的初始化

1.完成程序執行前的準備工作。
2.在這期間,靜態方法,變量,代碼塊會被執行,同時在會開闢一塊存儲空間用來存放靜態的數據。
3.初始化只在類加載的時候執行一次

java類的實例化

1.創建一個對象的過程。
new或者Class.newInstance()
2.這期間中會在堆中開闢內存,將一些非靜態的方法,變量存放在裏面。
3.在程序執行的過程中,可以創建多個對象,既多次實例化
4.每次實例化都會開闢一塊新的內存。

java類的加載過程

加載
通過類名獲取類的二進制字節流是通過類加載器(ClassLoader)來完成的。其加載過程使用“雙親委派模型”。(雙親委派模型:當某個類加載器需要加載某個.class文件時,它首先把這個任務委託給他的上級類加載器,遞歸這個操作,如果上級的類加載器沒有加載,自己纔會去加載這個類。使用雙親委派模型是爲了保證Class文件的安全,不被篡改,同事也可保證Class類是唯一的,不會重複加載)
驗證
當一個類被加載之後,必須要驗證一下這個類是否合法,比如這個類是不是符合字節碼的格式、變量與方法是不是有重複、數據類型是不是有效、繼承與實現是否合乎標準等等。總之,這個階段的目的就是保證加載的類是能夠被jvm所運行。
準備
爲類變量(靜態變量)在方法區分配內存,並設置零值。注意:這裏是類變量,不是實例變量,實例變量是對象分配到堆內存時根據運行時動態生成的。
解析
把常量池中的符號引用解析爲直接引用:根據符號引用所作的描述,在內存中找到符合描述的目標並把目標指針指針返回。
初始化
類的初始化過程是這樣的:按照順序自上而下運行類中的變量賦值語句和靜態語句,如果有父類,則首先按照順序運行父類中的變量賦值語句和靜態語句在類的初始化階段,只會初始化與類相關的靜態賦值語句和靜態語句,也就是有static關鍵字修飾的信息,而沒有static修飾的賦值語句和執行語句在實例化對象的時候纔會運行。執行clinit()方法(clinit是class initialize的簡寫)
實例化
在堆區分配內存空間,執行實例對象初始化,設置引用變量a指向剛分配的內存地址

總結

這次面試考官主考了java的基本知識,上述的東西其實都是我們日常用的熟的不能再熟的東西,可是在陳述的時候實例化和初始化我答的並不好,在此記錄,以此鞭策,共勉大家。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章