static用法

hatch發表於2018-08-16

static關鍵字可以用來修飾變數,修飾方法,靜態程式碼塊,靜態內部類以及靜態導包。

static修飾變數

static變數是屬於類級別的,隨著類的載入而載入,類的每個例項都是訪問的這個靜態變數,在記憶體中只有一份。

public class StaticVarDemo {

    public static void main(String[] args) {

        StaticClass staticClass1 = new StaticClass();
        staticClass1.staticVar = 10;

        StaticClass staticClass2 = new StaticClass();
        staticClass2.staticVar = 20;

        System.out.println(staticClass1.staticVar);
        System.out.println(staticClass2.staticVar);

        StaticClass.staticVar = 30;

        System.out.println(staticClass1.staticVar);
        System.out.println(staticClass2.staticVar);

    }

}

class StaticClass {
    public static Integer staticVar;

}

Output:
20
20
30
30

複製程式碼

靜態變數staticVar設定為30,通過staticClass1,staticClass2訪問staticVar值也為30.

另外我們可以直接通過類名來訪問靜態變數,不用建立類例項來訪問,可以很清楚的表明靜態變數屬於類級別。

static修飾方法

public class StaticVarDemo {

    public static void main(String[] args) {

        StaticClass staticClass1 = new StaticClass();
        staticClass1.staticVar = 10;

        StaticClass staticClass2 = new StaticClass();
        staticClass2.staticVar = 20;

        System.out.println(staticClass1.staticVar);

        StaticClass.staticVar = 30;

        System.out.println(staticClass1.staticVar);
        System.out.println(staticClass2.getStaticVar());

    }

}

class StaticClass {
    public static Integer staticVar;
    public static Integer getStaticVar(){
        return staticVar;
    }

}

Output:
20
30
30
複製程式碼

值得注意的是:

1.只能在靜態方法內呼叫靜態屬性或者靜態方法,不能呼叫非靜態屬性和方法
2.靜態方法可以通過它的類引用訪問,並且不需要建立類的例項。雖然也可以使用例項引用訪問,但與通過類引用訪問相比沒有任何區別
3.隨著類的載入而載入,且在記憶體中只有一份
複製程式碼

靜態程式碼塊

靜態程式碼塊是類初始化的一部分,用static包裹起來的程式碼塊

public class StaticVarDemo {

    static {
        System.out.println("Hello world~");
    }

    static {
        System.out.println("Learn static");
    }

    public static void main(String[] args) {
    }
}

Output:
Hello world~
Learn static
複製程式碼

在記憶體中載入類時,就會執行靜態塊。一個類可以有多個靜態塊,以在類定義中出現的相同順序執行。

靜態內部類

靜態內部類與其他靜態成員一樣,屬於類級別,因此可以訪問內部靜態類而不具有外部類的物件。

public class StaticVarDemo {

    private static Integer world = 2;

    public static void main(String[] args) {
        System.out.println(StaticInnerClass.hello);
        System.out.println(StaticInnerClass.getHelloWorld());
    }

    static class StaticInnerClass{
        public static Integer hello = 1;

        public static Integer getHelloWorld(){
            return hello + world;
        }
    }
}

Output:
1
3
複製程式碼

值得注意的是:

靜態內部類不能訪問外部類的非靜態成員。
只能訪問外部類的靜態成員。
複製程式碼

靜態導包

靜態匯入類中的靜態成員,並允許它們在沒有類引用的情況下使用。

要使用靜態成員(方法和變數)我們就要用類.類方法(類變數)。如果使用了靜態導包,就不用在給出類了。

//Static import statement
import static java.lang.System.out;

public class StaticVarDemo {

    public static void main(String[] args) {
        out.println("hello world");
    }
}
複製程式碼

總結

1.靜態成員屬於類。不需要建立類例項來訪問靜態成員。

2.靜態成員(變數和方法)只能在靜態方法和靜態塊中訪問。

3.不能在靜態方法、塊和內部類中訪問非靜態成員。

4.一個類可以有多個靜態塊,以在類定義中出現的相同順序執行。

5.只有宣告為內部類時,類才可以是靜態的。

6.靜態匯入可用於從類匯入所有靜態成員。使用時就不用在給出類了。

相關文章