JAVA面試題 static關(guān)鍵字詳解
問題
面試官Q(mào)1:請(qǐng)說(shuō)說(shuō)static關(guān)鍵字,你在項(xiàng)目中是怎么使用的?
static 關(guān)鍵字可以用來(lái)修飾:屬性、方法、內(nèi)部類、代碼塊;
static 修飾的資源屬于類級(jí)別,是全體對(duì)象實(shí)例共享的資源;
使用 static 修飾的屬性,靜態(tài)屬性是在類的加載期間初始化的,使用類名.屬性訪問
案例說(shuō)明
①修飾成員變量
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;
}
運(yùn)行結(jié)果如下:
0 0 0
上面的代碼我們很熟悉,根據(jù)Foo構(gòu)造出的每一個(gè)對(duì)象都是獨(dú)立存在的,保存有自己獨(dú)立的成員變量,相互不會(huì)影響,他們?cè)趦?nèi)存中的示意如下:

從上圖中可以看出,f1、f2和f3三個(gè)變量引用的對(duì)象分別存儲(chǔ)在內(nèi)存中堆區(qū)域的不同地址中,所以他們之間相互不會(huì)干擾。對(duì)象的成員屬性都在這了,由每個(gè)對(duì)象自己保存。f1.id、f2.id、f3.id相當(dāng)于“每個(gè)人一個(gè)水杯”。
我們對(duì)上面的代碼,做如下修改:
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++;
}
}
運(yùn)行結(jié)果如下:
0 1 2 3
程序執(zhí)行過程內(nèi)存圖如下所示:
第 1 步:加載類

static修飾的變量在類加載期間初始化,且在方法區(qū)中分配,屬于線程共享區(qū),所有的對(duì)象實(shí)例共享一份數(shù)據(jù)。
第 2步:繼續(xù)加載類

第 3步:繼續(xù)加載類

最終加載結(jié)果如上述三個(gè)步驟
②修飾成員方法
static的另一個(gè)作用,就是修飾成員方法。相比于修飾成員屬性,修飾成員方法對(duì)于數(shù)據(jù)的存儲(chǔ)上面并沒有多大的變化,因?yàn)槲覀儚纳厦婵梢钥闯?,方法本?lái)就是存放在類的定義當(dāng)中的(方法區(qū))。static修飾成員方法最大的作用,就是可以使用"類名.方法名"的方式操作方法,避免了先要new出對(duì)象的繁瑣和資源消耗,我們可能會(huì)經(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)代碼塊是在類加載期間運(yùn)行的代碼塊,由于類只加載一次,所以靜態(tài)代碼塊只執(zhí)行一次!靜態(tài)代碼塊用途很常見,一般用來(lái)在類加載以后初始化一些靜態(tài)資源時(shí)候使用。如:加載配置文件等
package com.ant.param;
public class StaticBlockDemo {
public static void main(String[] args) {
Foo foo = new Foo();
}
}
class Foo{
//代碼塊,在創(chuàng)建對(duì)象的時(shí)候執(zhí)行,使用很少,和構(gòu)造器差不多
{
System.out.println("創(chuàng)建對(duì)象了!");
}
//靜態(tài)代碼塊,在類加載期間執(zhí)行,用于加載配置文件或者其他信息等
static{
System.out.println("類加載了!");
}
public Foo(){
System.out.println("調(diào)用了構(gòu)造器!");
}
}
靜態(tài)塊用法:將多個(gè)類成員放在一起初始化,使得程序更加規(guī)整,對(duì)理解對(duì)象的初始化過程非常關(guān)鍵;
在我的印象中,這些問題一般初中級(jí)Java工程師會(huì)被問到,都是很常規(guī)的面試題,您會(huì)了嗎?
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript中類型的強(qiáng)制轉(zhuǎn)換與隱式轉(zhuǎn)換詳解
類型強(qiáng)制Coercion是將值從一種類型轉(zhuǎn)換為另一種類型的過程(例如字符串轉(zhuǎn)換為數(shù)字,對(duì)象轉(zhuǎn)換為布爾值等),下面這篇文章主要給大家給大家介紹了JavaScript中類型的強(qiáng)制轉(zhuǎn)換與隱式轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2021-08-08
javascript實(shí)現(xiàn)一個(gè)數(shù)值加法函數(shù)
這篇文章主要介紹了javascript實(shí)現(xiàn)一個(gè)數(shù)值加法函數(shù),十分的簡(jiǎn)單實(shí)用,方便大家理解javascript,有需要的小伙伴可以參考下。2015-06-06
Iframe 自動(dòng)適應(yīng)頁(yè)面的高度示例代碼
這篇文章主要介紹了Iframe如何自動(dòng)適應(yīng)頁(yè)面的高度,需要的朋友可以參考下2014-02-02
JavaScript實(shí)現(xiàn)的鼠標(biāo)響應(yīng)顏色漸變效果完整實(shí)例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的鼠標(biāo)響應(yīng)顏色漸變效果,涉及javascript面向?qū)ο蠹笆录O(jiān)聽、響應(yīng)機(jī)制相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
js實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出為EXCEL(支持大量數(shù)據(jù)導(dǎo)出)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出為EXCEL,支持大量數(shù)據(jù)導(dǎo)出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03

