還是在復習Java掂榔,這一次是復習了static修飾符间校,再來總結一下吧。
一钢猛、static修飾符
static修飾符不能修飾類(這里不考慮內(nèi)部類)察郁,只能修飾成員變量和成員方法衍慎,用static修飾的成員變量稱之為靜態(tài)變量,用static修飾的成員方法稱之為靜態(tài)方法绳锅,靜態(tài)變量和靜態(tài)方法可以通過類名直接訪問和調(diào)用西饵,當然也可以通過對象名,但不推薦這么做鳞芙。
靜態(tài)變量和靜態(tài)方法獨立于該類的任何對象眷柔,也就是說,它不依賴類特定的實例原朝,被類的所有實例所共享驯嘱。
二、一些小區(qū)別
類的成員方法中喳坠,可以直接訪問和調(diào)用該類的成員變量鞠评、靜態(tài)變量、成員方法和靜態(tài)方法壕鹉。
類的靜態(tài)方法中剃幌,可以直接訪問和調(diào)用該類的靜態(tài)變量和靜態(tài)方法,但對于成員變量和成員方法晾浴,則需要通過對象名(廢話......)负乡。
類中的靜態(tài)代碼塊,同靜態(tài)方法脊凰。靜態(tài)代碼塊的示例代碼如下:
public class Test {
private static int a;
private int b;
static {
Test.a = 3;
System.out.println(a);
Test t = new Test();
t.f();
t.b = 1000;
System.out.println(t.b);
}
static {
Test.a = 4;
System.out.println(a);
}
public static void main(String[] args) {
// TODO 自動生成方法存根
}
static {
Test.a = 5;
System.out.println(a);
}
public void f() {
System.out.println("hhahhahah");
}
}
三抖棘、執(zhí)行順序
當類加載器加載字節(jié)碼文件時,會先執(zhí)行靜態(tài)代碼塊狸涌,完成靜態(tài)變量的初始化工作切省,若有多個static代碼塊(位置可以隨便放,只要不在方法體內(nèi))帕胆,JVM將按照它們在類中出現(xiàn)的先后順序依次執(zhí)行朝捆,每個static代碼塊只會被執(zhí)行一次;接著執(zhí)行main方法懒豹;在構造對象時芙盘,會先執(zhí)行構造代碼塊诊杆,接著執(zhí)行構造函數(shù)。
四何陆、main方法為什么是靜態(tài)的
非靜態(tài)的方法需要先構造類的實例才能調(diào)用,而程序尚未執(zhí)行豹储,又怎么構造對象贷盲,所以類的main方法都是靜態(tài)的,這樣JVM只要知道類剥扣,即可執(zhí)行這個類的main方法巩剖。
五、為什么抽象方法不能是靜態(tài)的
因為靜態(tài)的方法不會被子類覆蓋钠怯。子類不會繼承父類的static變量和方法佳魔,靜態(tài)的東西是屬于類本身的,但是子類可以訪問父類的靜態(tài)變量和方法晦炊,所以鞠鲜,子類和父類中同名的static變量和方法是相互獨立的,并不存在任何重寫(覆蓋)的關系断国。
還可以這么想贤姆,如果抽象類中定義了靜態(tài)方法,那么是可以通過類名來調(diào)用這個靜態(tài)方法的(抽象類只是說不能構造一個抽象類的實例而已)稳衬,所以一個抽象方法如果被定義成靜態(tài)的霞捡,那豈不是可以通過類名調(diào)用一個尚未實現(xiàn)的方法,這肯定是錯的薄疚。
轉(zhuǎn)載請注明如下內(nèi)容:
文章來自簡書碧信,作者:就是楊宗
原文鏈接:http://www.reibang.com/p/e5e091177413