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.靜態匯入可用於從類匯入所有靜態成員。使用時就不用在給出類了。