1. 程式人生 > >【Java基礎】static關鍵字

【Java基礎】static關鍵字

通過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 class 
StaticTest { 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定義的結構不受例項化物件的控制,可以在沒有例項化物件的時候進行訪問