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 靜態方法...