淺談Java中類的實(shí)例化步驟
就個(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é)果。
- 1.首先分析一段程序的執(zhí)行后的結(jié)果,我們得先找到程序的入口,然后才能著手分析。也就是main()方法。
- 2.我們發(fā)現(xiàn)main()方法在X類中,要執(zhí)行main()方法,還得先將X類加載到內(nèi)存中。
- 3.X類加載完成后,會做什么事情呢?別急,先來看看static的作用,不知道吧。告訴你:static就是在類被第一次加載的時(shí)候執(zhí)行,以后就不再執(zhí)行。
- 4.知道了static的作用,那么X類被加載,那么就會先執(zhí)行X類的靜態(tài)屬性和靜態(tài)語句塊(static),執(zhí)行先后順序看誰在前面就先執(zhí)行誰。只在此時(shí)執(zhí)行,以后都不會。
- 5.所以一個(gè)輸出結(jié)果為tttt,沒問題了吧。
- 6.X類的static語句塊執(zhí)行完了,就該執(zhí)行main()方法啦。
- 7.new Z();此方法被執(zhí)行。
- 8.既然new Z();那么Z類就要被加載。因?yàn)閆類繼承X類。所以必須先加載X類才行。因?yàn)閄類已經(jīng)被加載。所以此時(shí)不用再加載X類了。Z類加載好了就要執(zhí)行Z類的static語句塊
- 9.那么就會打印出tt了吧。
- 10.都加在完后就要實(shí)例化對象了。
- 11.實(shí)例化Z之前,還得先實(shí)例化X對吧。因?yàn)樽宇惖臉?gòu)造方法都會調(diào)用父類的構(gòu)造方法。
- 12.那就先實(shí)例化X類吧。
- 13.執(zhí)行X方法前還得先初始化對不。也就是獲取所有屬性。那么X類的屬性Y就會獲取。
- 14.即X類的Y y=new Y();要被執(zhí)行。也就是會打印Y。
- 15.接著執(zhí)行System.out.println("X");
- 16.然后就是執(zhí)行Z的構(gòu)造方法
- 17.同樣先獲取Z的屬性Y y=new Y();打印Y。
- 18.再執(zhí)行System.out.println("Z");
整個(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)鏈接
相關(guān)文章
Java內(nèi)存各部分OOM出現(xiàn)原因及解決方法(必看)
下面小編就為大家?guī)硪黄狫ava內(nèi)存各部分OOM出現(xiàn)原因及解決方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
Java Web開發(fā)之基于Session的購物商店實(shí)現(xiàn)方法
這篇文章主要介紹了Java Web開發(fā)之基于Session的購物商店實(shí)現(xiàn)方法,涉及Java針對session的操作及數(shù)據(jù)庫操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
在Struts2中如何將父類屬性序列化為JSON格式的解決方法
本篇文章,小編將為大家介紹關(guān)于在Struts2中如何將父類屬性序列化為JSON格式的解決方法,有需要的朋友可以參考一下2013-04-04
Java使用JDBC連接Oracle_MSSQL實(shí)例代碼
這篇文章主要介紹了Java使用JDBC連接Oracle_MSSQL實(shí)例代碼,需要的朋友可以參考下2014-01-01
淺談Java中GuavaCache返回Null的注意事項(xiàng)
Guava在實(shí)際的Java后端項(xiàng)目中應(yīng)用的場景還是比較多的,比如限流,緩存,容器操作之類的,本文主要介紹了GuavaCache返回Null的注意事項(xiàng),感興趣的可以了解一下2021-10-10
Java開發(fā)工具Eclipse使用技巧全局搜索和更替
這篇文章主要介紹了Java開發(fā)工具Eclipse使用技巧全局搜索和更替,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

