JAVA面試題 static關(guān)鍵字詳解
問題
面試官Q(mào)1:請說說static關(guān)鍵字,你在項目中是怎么使用的?
static 關(guān)鍵字可以用來修飾:屬性、方法、內(nèi)部類、代碼塊;
static 修飾的資源屬于類級別,是全體對象實例共享的資源;
使用 static 修飾的屬性,靜態(tài)屬性是在類的加載期間初始化的,使用類名.屬性訪問
案例說明
①修飾成員變量
package com.ant.param; public class StaticFieldDemo { public static void main(String[] args) { Foo f1 = new Foo(); Foo f2 = new Foo(); Foo f3 = new Foo(); System.out.println(f1.id + " " + f2.id + " " + f3.id ); } } class Foo{ int id; }
運行結(jié)果如下:
0 0 0
上面的代碼我們很熟悉,根據(jù)Foo構(gòu)造出的每一個對象都是獨立存在的,保存有自己獨立的成員變量,相互不會影響,他們在內(nèi)存中的示意如下:
從上圖中可以看出,f1、f2和f3三個變量引用的對象分別存儲在內(nèi)存中堆區(qū)域的不同地址中,所以他們之間相互不會干擾。對象的成員屬性都在這了,由每個對象自己保存。f1.id、f2.id、f3.id相當(dāng)于“每個人一個水杯”。
我們對上面的代碼,做如下修改:
package com.ant.param; public class StaticFieldDemo { public static void main(String[] args) { Foo f1 = new Foo(); Foo f2 = new Foo(); Foo f3 = new Foo(); System.out.println(f1.id + " " + f2.id + " " + f3.id + " " + Foo.i); } } class Foo{ int id; static int i=0; public Foo(){ id = i++; } } 運行結(jié)果如下: 0 1 2 3
程序執(zhí)行過程內(nèi)存圖如下所示:
第 1 步:加載類
static修飾的變量在類加載期間初始化,且在方法區(qū)中分配,屬于線程共享區(qū),所有的對象實例共享一份數(shù)據(jù)。
第 2步:繼續(xù)加載類
第 3步:繼續(xù)加載類
最終加載結(jié)果如上述三個步驟
②修飾成員方法
static的另一個作用,就是修飾成員方法。相比于修飾成員屬性,修飾成員方法對于數(shù)據(jù)的存儲上面并沒有多大的變化,因為我們從上面可以看出,方法本來就是存放在類的定義當(dāng)中的(方法區(qū))。static修飾成員方法最大的作用,就是可以使用"類名.方法名"的方式操作方法,避免了先要new出對象的繁瑣和資源消耗,我們可能會經(jīng)常在幫助類中看到它的使用:
package com.ant.param; public class StaticFieldDemo { private static void print(){ System.out.println("hello"); } public static void main(String[] args) { StaticFieldDemo.print(); } }
③修飾靜態(tài)代碼塊
靜態(tài)代碼塊是在類加載期間運行的代碼塊,由于類只加載一次,所以靜態(tài)代碼塊只執(zhí)行一次!靜態(tài)代碼塊用途很常見,一般用來在類加載以后初始化一些靜態(tài)資源時候使用。如:加載配置文件等
package com.ant.param; public class StaticBlockDemo { public static void main(String[] args) { Foo foo = new Foo(); } } class Foo{ //代碼塊,在創(chuàng)建對象的時候執(zhí)行,使用很少,和構(gòu)造器差不多 { System.out.println("創(chuàng)建對象了!"); } //靜態(tài)代碼塊,在類加載期間執(zhí)行,用于加載配置文件或者其他信息等 static{ System.out.println("類加載了!"); } public Foo(){ System.out.println("調(diào)用了構(gòu)造器!"); } }
靜態(tài)塊用法:將多個類成員放在一起初始化,使得程序更加規(guī)整,對理解對象的初始化過程非常關(guān)鍵;
在我的印象中,這些問題一般初中級Java工程師會被問到,都是很常規(guī)的面試題,您會了嗎?
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript中的稀疏數(shù)組與密集數(shù)組[譯]
一般來說,JavaScript中的數(shù)組是稀疏的,也就是說,數(shù)組中的元素之間可以有空隙,因為一個數(shù)組其實就是一個鍵值映射.本文解釋了如何創(chuàng)建稀疏數(shù)組和不稀疏的數(shù)組2012-09-09javascript中的altKey 和 Event屬性大全
本文給大家介紹javascript中的altkey和event屬性大全,涉及到altkey和event屬性語法定義及用法,本文介紹的非常詳細,感興趣的朋友一起看看吧2015-11-11總結(jié)JavaScript中布爾操作符||與&&的使用技巧
這篇文章主要介紹了總結(jié)JavaScript中布爾操作符||與&&的使用技巧,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-11-11基于JavaScript實現(xiàn)TAB標(biāo)簽效果
js實現(xiàn)tab標(biāo)簽效果,在項目中經(jīng)常用到,今天抽點時間把我寫的js實現(xiàn)tab標(biāo)簽效果源碼分享給大家,對js tab標(biāo)簽代碼需要的朋友參考下2016-01-01