static 關鍵字
static可以修飾類(內部類),成員變量,方法
局部變量不能用static修飾
static修飾成員變量
static修飾的成員變量稱爲靜態成員變量,沒有使用static修飾的變量叫做實例成員變量
靜態成員變量與實例成員變量的區別
1.從變量的個數上講
靜態成員變量歸整個類所有,由所有的對象所共享
改變了靜態成員變量的值,其他對象調用的結果是修改後的結果,影響其他對象。
實例成員變量歸當前對象所有,值的改變不影響其他對象。
2.訪問方式
靜態成員變量的推薦訪問方式,通過類名.靜態成員變量的方式訪問。
3.初始化時間
類初始化的時候靜態成員變量初始化,實例成員變量在創建對象時纔會初始化,靜態成員
變量初始化早於實例成員變量,靜態成員變量不依賴對象而存在。
static修飾方法
使用static修飾的方法稱爲靜態方法
沒有使用static修飾的方法稱爲實例方法
1.從訪問方式上講
靜態方法既可以通過類名來訪問也可以通過指向對象的引用來訪問(不推薦)
2.成員的訪問
靜態方法只能訪問類中的靜態成員,不能訪問實例成員
實例方法既可以訪問靜態成員,也可以訪問實例成員
3.this和super的使用
靜態方法中不能使用this與super。
而實例方法中可以使用this與super。
public class Static {
//靜態成員變量
static int x=1;
//實例成員變量
int y = 2;
public void method(){}
public static void method1(){}
public static void main(String[] args) {
Static s = new Static();
Static s2 = new Static();
s.y=3;
System.out.println("y的值:"+s2.y);
s.x=3;
System.out.println("x的值:"+s2.x);
//實例方法的調用
s.method();
//靜態方法的調用
s.method1();
Static.method1();
method1();
}
}
y的值:2
x的值:3
靜態成員變量的初始化
1.聲明處初始化
2.使用靜態初始化塊
3.兩種初始化執行順序,按代碼編寫順序執行
不能在構造器中對靜態成員變量進行初始化,因爲構造器在創建
對象的時候纔會得到執行。而靜態成員變量不需要創建任何對象
就能夠進行訪問。
public class StaticInit {
//聲明處初始化
static int x=getX();
//靜態初始化塊
//靜態初始化塊會在初始化類時得到執行(在main方法執行之前執行)
static{
x = 2;
System.out.println("靜態初始化塊");
}
public static int getX(){
System.out.println("聲明處初始化");
return 5;
}
public static void main(String[] args) {
System.out.println("main方法");
}
}
聲明處初始化
靜態初始化塊
main方法