溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

JAVA面試題之static關(guān)鍵字的示例分析

發(fā)布時(shí)間:2021-08-17 13:55:14 來(lái)源:億速云 閱讀:176 作者:小新 欄目:web開(kāi)發(fā)

這篇文章給大家分享的是有關(guān)JAVA面試題之static關(guān)鍵字的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

問(wèn)題

面試官Q(mào)1:請(qǐng)說(shuō)說(shuō)static關(guān)鍵字,你在項(xiàng)目中是怎么使用的?

static 關(guān)鍵字可以用來(lái)修飾:屬性、方法、內(nèi)部類(lèi)、代碼塊;

static 修飾的資源屬于類(lèi)級(jí)別,是全體對(duì)象實(shí)例共享的資源;

使用 static 修飾的屬性,靜態(tài)屬性是在類(lèi)的加載期間初始化的,使用類(lèi)名.屬性訪問(wèn)

案例說(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)存中的示意如下:

JAVA面試題之static關(guān)鍵字的示例分析

從上圖中可以看出,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í)行過(guò)程內(nèi)存圖如下所示:

第 1 步:加載類(lèi)

JAVA面試題之static關(guān)鍵字的示例分析

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

第 2步:繼續(xù)加載類(lèi)

JAVA面試題之static關(guān)鍵字的示例分析

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

JAVA面試題之static關(guān)鍵字的示例分析

最終加載結(jié)果如上述三個(gè)步驟

②修飾成員方法

static的另一個(gè)作用,就是修飾成員方法。相比于修飾成員屬性,修飾成員方法對(duì)于數(shù)據(jù)的存儲(chǔ)上面并沒(méi)有多大的變化,因?yàn)槲覀儚纳厦婵梢钥闯?,方法本?lái)就是存放在類(lèi)的定義當(dāng)中的(方法區(qū))。static修飾成員方法最大的作用,就是可以使用"類(lèi)名.方法名"的方式操作方法,避免了先要new出對(duì)象的繁瑣和資源消耗,我們可能會(huì)經(jīng)常在幫助類(lèi)中看到它的使用:

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)代碼塊是在類(lèi)加載期間運(yùn)行的代碼塊,由于類(lèi)只加載一次,所以靜態(tài)代碼塊只執(zhí)行一次!靜態(tài)代碼塊用途很常見(jiàn),一般用來(lá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)代碼塊,在類(lèi)加載期間執(zhí)行,用于加載配置文件或者其他信息等
 static{
  System.out.println("類(lèi)加載了!");
 }
 public Foo(){
  System.out.println("調(diào)用了構(gòu)造器!");
 }
}

靜態(tài)塊用法:將多個(gè)類(lèi)成員放在一起初始化,使得程序更加規(guī)整,對(duì)理解對(duì)象的初始化過(guò)程非常關(guān)鍵;

感謝各位的閱讀!關(guān)于“JAVA面試題之static關(guān)鍵字的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI