大家都知道,我們可以基於一個類創建多個該類的對象,每個對象都擁有自己的成員,
互相獨立,然而在某些時候,我們更希望該類所有的對象共享同一個成員,此時就是
static 大顯身手的時候了。
Java 中被 static 修飾的成員稱爲靜態成員或類成員。它屬於整個類所有,而不是
某個對象所有,即被類的所有對象所共享。靜態成員可以使用類名直接訪問,也可以
使用對象名進行訪問。當然,鑑於他作用的特殊性更推薦用類名訪問~~
使用 static
可以修飾變量、方法和代碼塊。
一:static使用之靜態變量
例如,我們在類中定義了一個靜態變量 className ,操作代碼如下所示:
public
class HelloWorld {
// 定義靜態變量,保存班級名稱
static String className = "JAVA開發一班";
public static void main(String[] args) {
// 訪問靜態變量,通過類名直接訪問
System.out.println( HelloWorld.className );
//創建類的對象
HelloWorld hello=new HelloWorld();
//使用對象名訪問靜態變量
System.out.println( hello.className );
}
}
注意:
靜態成員屬於整個類,當系統第一次使用該類時,就會爲其分配內存空間直到該類被卸載纔會進行資源回收!~~
二:static使用之靜態方法
與靜態變量一樣,我們也可以使用 static 修飾方法,稱爲靜態方法或類方法。其實之前我們
一直寫的main 方法就是靜態方法。靜態方法的使用如:
public classHelloWorld {
// 使用static關鍵字聲明靜態方法
public static void print(){
System.out.println("歡迎您:xxx!");
}
publicstaticvoidmain(String[] args){
//使用類名直接調用靜態方法
HelloWorld.print();
//使用對象名調用靜態方法
HelloWorld hello=new HelloWorld();
hello.print();
}
}
需要注意:
1.靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員,如果希望在
靜態方法中調用非靜態變量,可以通過創建類的對象,然後通過對象來訪問非靜態變量。
2.在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量。
3.
靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。
三:static使用之靜態初始化塊
Java 中可以通過初始化塊進行數據賦值。如:
public classHelloWorld {
Stringname;//定義一個成員變量
{//通過一個初始化塊爲成員變量賦值
name="xxx";
}
}
在類的聲明中,可以包含多個初始化塊,當創建類的實例時,就會依次執行這些代碼塊。如果使用 static 修飾初始化塊,就稱爲靜態初始化塊
需要特別注意:靜態初始化塊只在類加載時執行,且只會執行一次,同時靜態初始化塊只能給靜態變量賦值,不能初始化普通的成員變量
我們來看一段代碼:
public classHelloWorld {
String name; // 聲明變量name
Stringsex;// 聲明變量sex
static int age;// 聲明靜態變量age
// 構造方法
public HelloWorld () {
System.out.println("通過構造方法初始化name");
name = "tom";
}
// 初始化塊
{
System.out.println("通過初始化塊初始化sex");
sex = "男";
}
// 靜態初始化塊
static {
System.out.println("通過靜態初始化塊初始化age");
age = 20;
}
public void show() {
System.out.println("姓名:" + name + ",性別:" + sex + ",年齡:" + age);
}
public static void main(String[] args) {
// 創建對象
HelloWorldhello= newHelloWorld();
// 調用對象的show方法
hello.show();
}
}
運行結果如下:
通過靜態初始化塊初始化age
通過初始化塊初始化sex
通過構造方法初始化name
姓名:tom,性別:男,年齡:20
通過輸出結果,我們可以看到,程序運行時靜態初始化塊最先被執行,然後執行普通初始化塊,
最後才執行構造方法。由於靜態初始化塊只在類加載時執行一次,所以當再次創建新的對
象時並未執行靜態初始化塊。