歡迎您光臨本站 註冊首頁

Java中靜態變數的適用場景

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

Java類中的靜態變數在程序運行期間,其內存空間對所有該類的對象實例而言是共享的,有些時候可以認為是全局變數.因此在某些時候為了節省系統內存開銷、共享資源,可以將類中的一些變數聲明為靜態變數,通過下面的例子,你可以發現合理應用靜態變數帶來的好處:

Java代碼

public class WeekA{

static class Data {

private int week;

private String name;

Data(int i, String s) {

week= i;

name = s;

}

}

Data weeks[] = {

new Data(1, "Monday"), new Data(2, "Tuesay"), new Data(3, "Wednesday"), new Data(4, "Thursday"), new Data(5, "Friday"), new Data(6, "Saturday"), new Data(7, "Sunday")

};

public static void main(String args[]) {

final int N = 10000;

WeekA weekinstance;

for (int i = 1; i <= N; i ){

weekinstance = new WeekA ();

}

}

}

public class WeekA{

static class Data {

private int week;

private String name;

Data(int i, String s) {

week= i;

name = s;

}

}

Data weeks[] = {

new Data(1, "Monday"), new Data(2, "Tuesay"), new Data(3, "Wednesday"), new Data(4, "Thursday"), new Data(5, "Friday"), new Data(6, "Saturday"), new Data(7, "Sunday")

};

public static void main(String args[]) {

final int N = 10000;

WeekA weekinstance;

for (int i = 1; i <= N; i ){

weekinstance = new WeekA ();

}

}

}

在上面這段代碼中,沒有將Data weeks聲明為靜態變數,因此當創建WeekA對象時將會得到10 000個weeks對象的副本,這些對象被保存在內存中,但是weeks對象中的數據卻從來沒有被更改過,而且十分穩定.因此,如果能使所有對象共享該數據對象是個不錯的解決辦法,請看下面的代碼:

Java代碼

public class WeekB{

static class Data {

private int week;

private String name;

Data(int i, String s) {

week= i;

name = s;

}

}

static Data weeks[] = {

new Data(1, "Monday"), new Data(2, "Tuesay"), new Data(3, "Wednesday"), new Data(4, "Thursday"), new Data(5, "Friday"), new Data(6, "Saturday"), new Data(7, "Sunday")

};

public static void main(String args[]) {

final int N = 10000;

WeekB weekinstance;

for (int i = 1; i <= N; i ){

weekinstance = new WeekB ();

}

}

}

public class WeekB{

static class Data {

private int week;

private String name;

Data(int i, String s) {

week= i;

name = s;

}

}

static Data weeks[] = {

new Data(1, "Monday"), new Data(2, "Tuesay"), new Data(3, "Wednesday"), new Data(4, "Thursday"), new Data(5, "Friday"), new Data(6, "Saturday"), new Data(7, "Sunday")

};

public static void main(String args[]) {

final int N = 10000;

WeekB weekinstance;

for (int i = 1; i <= N; i ){

weekinstance = new WeekB ();

}

}

}

請注意在類WeekB中,在Data weeks[]之前添加了static關鍵字,將該對象變數聲明為靜態的,因此當你創建10 000個WeekB對象時系統中只保存著該對象的一份拷貝,而且該類的所有對象實例共享這份拷貝,這無疑節約了大量的不必要的內存開銷,同時實現了要完成的系統功能.

那麼是不是我們應該盡量地多使用靜態變數呢?其實不是這樣的,靜態變數生命周期較長,而且不易被系統回收,因此如果不能合理地使用靜態變數,就會適得其反,造成大量的內存浪費,所謂過猶不及.因此,建議在具備下列全部條件的情況下,盡量使用靜態變數:

(1)變數所包含的對象體積較大,佔用內存較多.

(2)變數所包含的對象生命周期較長.

(3)變數所包含的對象數據穩定.

(4)該類的對象實例有對該變數所包含的對象的共享需求.

如果變數不具備上述特點建議你不要輕易地使用靜態變數,以免弄巧成拙.


[火星人 ] Java中靜態變數的適用場景已經有836次圍觀

http://coctec.com/docs/java/show-post-60869.html