Java中靜態(tài)變量的適用場(chǎng)景發(fā)布者:本站 時(shí)間:2020-05-06 15:05:06
Java類(lèi)中的靜態(tài)變量在程序運行期間,其內存空間對所有該類(lèi)的對象實(shí)例而言是共享的,有些時(shí)候可以認為是全局變量。因此在某些時(shí)候為了節省系統內存開(kāi)銷(xiāo)、共享資源,可以將類(lèi)中的一些變量聲明為靜態(tài)變量,通過(guò)下面的例子,你可以發(fā)現合理應用靜態(tài)變量帶來(lái)的好處:
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 ();
}
}
}
在上面這段代碼中,沒(méi)有將Data weeks聲明為靜態(tài)變量,因此當創(chuàng )建WeekA對象時(shí)將會(huì )得到10 000個(gè)weeks對象的副本,這些對象被保存在內存中,但是weeks對象中的數據卻從來(lái)沒(méi)有被更改過(guò),而且十分穩定。因此,如果能使所有對象共享該數據對象是個(gè)不錯的解決辦法,請看下面的代碼:
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 ();
}
}
}
請注意在類(lèi)WeekB中,在Data weeks[]之前添加了static關(guān)鍵字,將該對象變量聲明為靜態(tài)的,因此當你創(chuàng )建10 000個(gè)WeekB對象時(shí)系統中只保存著(zhù)該對象的一份拷貝,而且該類(lèi)的所有對象實(shí)例共享這份拷貝,這無(wú)疑節約了大量的不必要的內存開(kāi)銷(xiāo),同時(shí)實(shí)現了要完成的系統功能。
那么是不是我們應該盡量地多使用靜態(tài)變量呢?其實(shí)不是這樣的,因為靜態(tài)變量生命周期較長(cháng),而且不易被系統回收,因此如果不能合理地使用靜態(tài)變量,就會(huì )適得其反,造成大量的內存浪費,所謂過(guò)猶不及。因此,建議在具備下列全部條件的情況下,盡量使用靜態(tài)變量:
(1)變量所包含的對象體積較大,占用內存較多。
(2)變量所包含的對象生命周期較長(cháng)。
(3)變量所包含的對象數據穩定。
(4)該類(lèi)的對象實(shí)例有對該變量所包含的對象的共享需求。
如果變量不具備上述特點(diǎn)建議你不要輕易地使用靜態(tài)變量,以免弄巧成拙。
選擇我們,優(yōu)質(zhì)服務(wù),不容錯過(guò)
1. 優(yōu)秀的網(wǎng)絡(luò )資源,強大的網(wǎng)站優(yōu)化技術(shù),穩定的網(wǎng)站和速度保證
2. 15年上海網(wǎng)站建設經(jīng)驗,優(yōu)秀的技術(shù)和設計水平,更放心
3. 全程省心服務(wù),不必擔心自己不懂網(wǎng)絡(luò ),更省心。
------------------------------------------------------------
24小時(shí)聯(lián)系電話(huà):021-58370032