【Java基礎】static關鍵字
阿新 • • 發佈:2018-11-08
通過static宣告的屬性或者方法可以通過類名稱直接呼叫
static方法只能呼叫static屬性或者方法,不能呼叫非static屬性或者方法
非static方法則不受限,可以任意呼叫static宣告的屬性或者方法
注意:main方法本身就是一個static方法
示例1:static方法呼叫非static和static屬性
public class StaticTest { static String staticStr = "這是一個靜態變數"; String norString = "這是一個普通變數"; public static void main(String[] args){ norString = "aa"; } }
執行程式碼會提示:Error:(10, 9) java: 無法從靜態上下文中引用非靜態 變數 norString
public class StaticTest { static String staticStr = "這是一個靜態變數"; String norString = "這是一個普通變數"; public static void main(String[] args){ staticStr = "aa"; } }
則會正常執行
示例2:static方法呼叫非static方法和static方法
public class StaticTest { static String staticStr = "這是一個靜態變數"; String norString = "這是一個普通變數"; public static void main(String[] args){ norFun(); } public void norFun(){ } }
提示:Error:(10, 9) java: 無法從靜態上下文中引用非靜態 方法 norFun()
public classStaticTest { static String staticStr = "這是一個靜態變數"; String norString = "這是一個普通變數"; public static void main(String[] args){ norFun(); } public static void norFun(){ } }
可以正常編譯
示例三:普通方法呼叫static屬性和方法
public class StaticTest { static String staticStr = "這是一個靜態變數"; String norString = "這是一個普通變數"; public static void main(String[] args){ new StaticTest().norFun(); } public static void staticFun(){ System.out.println("這是靜態方法"); } public void norFun(){ staticStr = "aaa"; staticFun(); } }會發現編譯正常通過
原因:記憶體可以分為四部分,棧記憶體、堆記憶體、全域性資料區、全域性程式碼區,static儲存在全域性資料區,所有的非static定義的結構必須是產生了例項化物件才會分配空間然後使用,而static定義的結構不受例項化物件的控制,可以在沒有例項化物件的時候進行訪問