java中static關鍵字用法

2021-07-08 15:27:52 字數 3274 閱讀 7133

static關鍵字

一、用法

1、static關鍵字表示靜態。能與屬性,方法,**塊,內部類等一起使用。

2、static修飾屬性和方法時,可以直接通過類名.屬性或類名.方法來訪問。

3、 靜態變數:

• 乙個類中,靜態的變數只分配一塊記憶體空間。多個例項物件共享該記憶體空間。

• 靜態的變數在類載入的時候,被初始化。也就是說,只要類被載入,不管是否使用該靜態變數,則都會自動的為其開闢空間,並初始化。

4、靜態方法

• 在類載入時,載入到jvm。直接使用類名.方法名呼叫。

5、 靜態**塊

• 是類的組成部分,在類第一次被載入的時候,執行一次。也就說,靜態**塊在程式執行時,只能被執行一次。

• 用於初始化靜態的屬性。

下面來看示例一:

staticdemo類

package com.jcxy.demo02;

public class staticdemo

}

test類

package com.jcxy.demo02;

public class test

}

列印輸出:

10jack

this is static demo!

示例二:靜態**塊的用法

包含普通成員變數,靜態成員變數,靜態**塊,動態**塊以及建構函式的類

package com.jcxy.demo02;

public class staticdemo3

public staticdemo3()

}

測試類test

package com.jcxy.demo02;

public class test

}

列印結果:

這是靜態**塊

這是非靜態**塊

這是物件初始化的構造方法清華

通過列印結果,我們不難看到,

1、當我們new乙個物件的時候,是靜態變數最先開闢記憶體(在賦值的情況下),未賦值則跳過。

2、接下才靜態**塊。

3、接著呼叫我們的構造方法,注意,呼叫構造方法的時候,在執行方法體之前。

4、先對普通成員變數進行初始化(當初賦值的情況下),如果沒賦值則跳過。

5、接著才執行非靜態方法。

6、最後才執行我們構造方法的方法體。

示例三:靜態變數定義在靜態**塊後與前的區別

看下面這種的輸出結果

package com.jcxy.demo02;

public class staticdemo1

public static string school = "清華";

}

test:

package com.jcxy.demo02;

public class test

}

列印輸出為:清華

為什麼呢?

這種情況:

相當於以下**:   

public static string school;

static

school = 「清華」;

1- 類載入時,為靜態屬性分配記憶體空間,且以預設值填充;

2- 從上向下執行,先為school賦值aaa,再為school賦值清華

但此時要注意的是,宣告語句在靜態**塊下面,在靜態**塊中的如果獲得靜態屬性的值,則會報錯。

看第二種情況:

package com.jcxy.demo02;

public class staticdemo1

}

test:

package com.jcxy.demo02;

public class test

}

列印:aaa

aaa原因分析:

第二種情況:

1- 類載入時,為靜態屬性分配記憶體空間,且以預設值填充;

2- 將清華賦值給school

3- 執行靜態**塊內容。

因為宣告在獲得school值之前,所以,可以system.out.println(school);

二、static特點:

1、static可以修飾屬性,方法,**塊。此時屬性,方法,**塊就成了類變數,靜態方法,靜態**塊。注意:靜態不能修飾區域性變數。

2、類變數,靜態方法,靜態**塊與具體某個物件無關,是屬於類級別。如果訪問許可權允許,通過類名.方法名或類名.屬性名訪問。

3、靜態變數,靜態**塊都是在類載入時,執行並初始化。

4、乙個類的靜態方法或靜態**塊,只能訪問靜態的屬性和靜態方法,不能直接訪問非靜態的屬性和方法。對於非靜態的方法或**塊,可以直接訪問靜態的或非靜態的屬性和方法。

5、靜態方法或靜態**塊中,不能使用this,super關鍵字。因為this,super是物件,物件在靜態之後建立的。

6、靜態方法可以被覆蓋,但不體現多型;父類如果是靜態方法,子類不能覆蓋為非靜態方法;父類如果是非靜態方法,子類不能覆蓋為靜態方法。

7-構造方法不允許宣告為static。因為構造方法是在建立物件時,自動呼叫;而static屬於類級別的。

三、關於靜態的用法:

1、靜態屬性:(類變數)

• 節省記憶體空間。但生命週期從類載入分配記憶體開始,到程式結束。

• 實際使用中,當多個物件共享某些資料時,可以將這些設定為靜態的變數; 定義常量;

2、 靜態方法:

• 不需要建立物件,直接通過類名.方法。靜態方法中不能使用非靜態的屬性和方法。

• 在實際使用中,定義一些和非靜態的屬性和方法無關的功能時,使用。比如工具類。

3、靜態**塊

• 在類載入的時候,只執行一次。

• 實際的使用中,比較少。比如,jdbc時,資料庫驅動的載入,可以放在靜態**塊中,僅載入一起,後續就可以直接使用。

總的來說,對於static關鍵字的理解就是要能夠理解static修飾的屬性或者方法的載入的順序。那要理解載入的順序,我們可以通過debug除錯來追蹤發現。如果想要更深入了解的話,可以通過記憶體分析來看更加的直觀。

Java中static關鍵字

靜態結構的生命週期要早於非靜態結構,同時 也要晚於非靜態結構 執行結果 變數變數值 c2.nation null c2.nation china public void test2 執行結果 輸出china 內容與靜態屬性大體相同 1.靜態方法內只能呼叫本類靜態屬性或靜態方法 2.靜態方法裡面是不能...

java中static關鍵字

一 可修飾成員變數和方法 靜態函式要注意的事項 1.靜態函式可呼叫類名或物件呼叫,而非靜態函式只能使用物件呼叫。2.靜態函式可直接訪問靜態成員,但不能訪問非靜態成員。原因 靜態函式可通過類名直接呼叫,這時可能還未存在非靜態成員,因為其是根據物件生成的。二 執行順序 靜態 塊的執行順序優先於非靜態 塊...

java中static關鍵字

static 方便在沒有建立物件的情況來呼叫 可以用來修飾類的成員方法 成員變數,塊 內部靜態類 靜態匯入包 1 靜態變數 被static修飾的變數叫靜態變數 或類變數 否則為例項變數,靜態變數類載入時分配一次記憶體,可以直接類名訪問 例項變數建立物件時被初始化,存在多個副本,互不影響。2 靜態方法...