您好,登錄后才能下訂單哦!
就個(gè)人的一些看法簡單的 談?wù)剆tatic。
就java 工程師來說,static非常容易在面試的時(shí)候被問到。
言歸正傳,書面上說static是靜態(tài)的。其實(shí)我把它理解為“全局的”。什么叫全局的?全局的屬性,全局的方法,全局的代碼塊。
全局屬性,全局方法,比較好理解就是這個(gè)類所有的對象都共有的屬性和方法。因?yàn)槭钦麄€(gè)類共有的,所以可以通過聲明直接調(diào)用。我把它理解為“單例模式”的屬性和方法。所謂單例模式就是指這個(gè)類聲明的所有對象共享這些屬性和方法。一個(gè)對象對這個(gè)屬性進(jìn)行了修改,所有對象再調(diào)這個(gè)屬性都是修改后的值了。
下面主要說一下static修飾的代碼塊,面試的一大考點(diǎn)就是static代碼塊是什么時(shí)候被加載的。
首先我們需要了解一下java虛擬機(jī)對類的加載過程。首先JVM會通過classloader將類的字節(jié)碼轉(zhuǎn)換成相應(yīng)的Class對象。其中classloader是雙親委托的方法來查找類文件的。
就是首先委托父類的classloader查找(父類也有父類就交由父類的父類查找以此類推,直到不再繼承別的classloader的類),如果查找不到再由自己來查找。如果自己也找不到就拋出異常。以上是準(zhǔn)備工作,當(dāng)這個(gè)類抽次被使用,我們會顯出石化這個(gè)類(如果有父類就先初始化他的父類),在初始化的過程中我們會處理static修飾的代碼。就是我們這里要說的static代碼塊。每個(gè)類知會初始化1次。(我們可以通過改變方法 Class.forName()中的第二個(gè)參數(shù)來控制是否初始化一個(gè)類)。
以下為網(wǎng)上找的一個(gè)經(jīng)典的例子。
面試題目如下:請寫出程序執(zhí)行完成之后的結(jié)果。
package extend; public class X { Y y=new Y(); static{ System.out.println("tttt"); } X(){ System.out.println("X"); } public static void main(String[] args) { new Z(); } } class Y{ Y(){ System.out.println("Y"); } } class Z extends X{ Y y=new Y(); static{ System.out.println("tt"); } Z(){ System.out.println("Z"); } }
先不告訴最后結(jié)果,我們先來分析下。一步一步推出結(jié)果。
整個(gè)過程就是這樣了?,F(xiàn)在知道結(jié)果了吧:
tttt
tt
Y
X
Y
Z
記住,面試有可能會標(biāo)出一些語句的,讓你選擇這些語句的執(zhí)行順序。不過只要知道原理,就沒什么難的了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對億速云的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。