static
在Java中static表示“全局”或者“靜態”的意思,用來修飾成員變量和成員方法,當然也可以修飾代碼塊。
Java把內存分爲棧內存和堆內存,其中棧內存用來存放一些基本類型的變量、數組和對象的引用,堆內存主要存放一些對象。在JVM加載一個類的時候,若該類存在static修飾的成員變量和成員方法,則會爲這些成員變量和成員方法在固定的位置開闢一個固定大小的內存區域,有了這些“固定”的特性,那麼JVM就可以非常方便地訪問他們。同時如果靜態的成員變量和成員方法不出作用域的話,它們的句柄(對句柄概念有疑惑的同學點這裏)都會保持不變。同時static所蘊含“靜態”的概念表示着它是不可恢復的,即在那個地方,你修改了,他是不會變回原樣的,你清理了,他就不會回來了。
同時被static修飾的成員變量和成員方法是獨立於該類的,它不依賴於某個特定的實例變量,也就是說它被該類的所有實例共享。所有實例的引用都指向同一個地方,任何一個實例對其的修改都會導致其他實例的變化。
static 關鍵字主要有以下四種使用場景:
1.修飾成員變量和成員方法: 被 static 修飾的成員屬於類,不屬於單個這個類的某個對象,被類中所有對象共享,可以並且建議通過類名調用。被static 聲明的成員變量屬於靜態成員變量,靜態變量 存放在 Java 內存區域的方法區。調用格式:類名.靜態變量名 類名.靜態方法名() 2.靜態代碼塊: 在調用類的靜態參數的時候,該類的靜態初始化方法會被優先調用
public class TestStatic {
public static void main(String[] args) {
System.out.println("實際對象中testStr值爲:"+TestStaticParam.TEST_STRING);
}
}
class TestStaticParam{
static String TEST_STRING = "測試靜態參數";
//靜態初始化-----2
static {
TEST_STRING = "測試靜態初始化";
System.out.println("TEST_STRING 被初始爲->測試靜態初始化");
}
//構造方法--------1
public TestStaticParam() {
this.TEST_STRING = "測試構造方法";
System.out.println("TEST_STRING 被初始爲->測試構造方法");
}
}
結果如下: 在創建該對象的時候,靜態初始化與構造方法的執行順序爲: 靜態初始化方法-> 構造方法
public static void main(String[] args) {
TestStaticParam test = new TestStaticParam();
System.out.println("實際對象中testStr值爲:"+test.TEST_STRING);
}
結果如下:
3.靜態內部類(static修飾類的話只能修飾內部類): 靜態內部類與非靜態內部類之間存在一個最大的區別: 非靜態內部類在編譯完成之後會隱含地保存着一個引用,該引用是指向創建它的外圍類,但是靜態內部類卻沒有。沒有這個引用就意味着:1. 它的創建是不需要依賴外圍類的創建。2. 它不能使用任何外圍類的非static成員變量和方法。 4.靜態導包(用來導入類中的靜態資源,1.5之後的新特性): 格式爲:import static 這兩個關鍵字連用可以指定導入某個類中的指定靜態資源,並且不需要使用類名調用類中靜態成員,可以直接使用類中靜態成員變量和成員方法。