class Test2{ public void method2(){ System.out.println("HelloWorld2"); } } class test{ public void method0(){ System.out.println("HelloWorld0"); } public static void method1(){ System.out.println("HelloWorld1"); } public static void main(String args[]){ new test().method0(); method1(); new Test2().method2(); } }
首先static的成員是在類加載的時候初始化的,JVM的CLASSLOADER的加載,首次主動使用加載,而非static的成員是在建立對象的時候,即new 操做的時候才初始化的;函數
前後順序是先加載,才能初始化,那麼加載的時候初始化static的成員,此時非static的成員尚未被加載必然不能使用,而非static的成員是在類加載以後,經過new操做符建立對象的時候初始化,此時static 已經分配內存空間,因此能夠訪問!this
簡單點說:靜態成員屬於類,不須要生成對象就存在了.而非靜態須要生成對象才產生.因此靜態成員不能直接訪問非靜態. spa
下面說說靜態的特色:code
1.隨着類的加載而加載對象
也就是,說靜態會隨着類的消失而消失,說明靜態的生命週期最長
2.優先於對象的存在
明確一點:靜態是先存在的對象是後存在的
3.被全部對象共享
4.能夠直接被類名多調用
實例變量和類變量的區別
1.存放位置
類變量隨着類的加載存在於方法區中,實例變量隨着對象的創建存在於堆內存裏
2.生命週期
類變量生命週期最長,隨着「類」的加載而加載,隨着類的消失而消失,實例變量隨着「對象」的消失而消失
靜態的使用注意事項:
1.靜態方法只能訪問靜態成員(包括成員變量和成員方法)
非靜態方法能夠訪問靜態也能夠訪問非靜態
2.靜態方法中不能夠定義this,super關鍵字
由於靜態優先於對象存在,因此靜態方法中不能夠出現this,super關鍵字
3.主函數是靜態的。
blog
靜態的利弊
利:對對象的共享數據進行單獨空間的存儲,節省空間,沒有必要每個對象中都存儲一份
能夠直接被類名所調用
弊:生命週期過長,訪問出現侷限性(只能訪問靜態)生命週期