Static關鍵字概述
static(靜態)關鍵字可以用于修飾變量、方法和代碼塊。我認為static關鍵字的主要用途是:方便程序在不創建對象的情況下調用相應的變量或者方法。被static修飾的變量或者方法可以簡單地通過應用類名來進行調用,無需創建相應的對象。
注意,Java語法規定,static不允許修飾局部變量
1、static變量
static變量即靜態變量,被所有對象所共享,在內存中只有一個副本,當且僅當類被加載時初始化一次。
舉個例子:
class StaticTest{
static int i = 47;
}
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
System.out.println(st1.i + " " + st2.i)
StaticTest.i++; // 不用新建對象,直接調用static變量
System.out.println(st1.i + " " + st2.i)
在這里,StaticTest內存在一個靜態變量i,在StaticTest類被加載時,i會初始化為47。新建兩個StaticTest變量st1和st2,輸出st1和st2的i的值,都為47。經過StaticTest.i++后,再輸出st1和st2的i的值,都變成了48。即靜態變量被這兩個對象共享,且只有一個副本。
如果一個類既有static變量,又有非static變量。那么在初始化時,先進行static變量的初始化,再進行普通變量的初始化,最后執行該類的構造函數。具體例子請查看“初始化和清除”一章。
2、static方法
static方法意味著“一個特定的方法沒有this,我們不可以從一個static方法內部發出對非static方法的調用”,因為非static的變量和方法都需要通過實際具體的對象進行調用,而static方法沒有this,不依附于任何對象。
即:非static的方法可以調用static的方法,但是static方法不能調用非static的方法。
因此,如果說想在不創建對象的情況下調用某個方法,就可以將這個方法設置為static。
最常見的static方法即為main方法(public static void main)。由于程序在執行main方法之前沒有任何對象,只能通過類名來調用,因此main方法必須是static的。
3、static代碼塊
static方法塊只會在類初次被加載時,按順序執行一次。巧妙利用static方法塊,可以在一定程度上減少內存的使用,優化程序性能。
我們來看一個例子:
public class StaticTest {
static Date a;
static Date b;
static{
a = new Date(2008);
b = new Date(2017);
}
boolean compare1(Date birthDate){
if(birthDate.compareTo(a) >= 0 && birthDate.compareTo(b) < 0)
return true;
return false;
}
boolean compare2(Date birthDate){
Date low = new Date(2008);
Date high = new Date(2010);
if(birthDate.compareTo(a) >= 0 && birthDate.compareTo(b) < 0)
return true;
return false;
}
}
我們希望實現輸入出生年月日,判斷是否在2008--2017年內出生。
按照compare2方法,每次輸入一個人的出生年月,都需要新建兩個Date對象,分別代表下界2008和上界2017,然后再進行比較。
如果我們先在StaticTest類中定義兩個static對象,同時通過static代碼塊在類初次被加載時對他們進行初始化為下界和上界。這樣在輸入數據進行比較compare1時,就不需要每次都新創建兩個Date對象,優化了程序的性能。
因此,我們可以將一些只需要初始化一次的初始化操作都放在static代碼塊中進行。
具體的一些代碼和面試題,可以參考:Java中的static關鍵字解析