先上實例
public class TestStatic { public static String staticString = "this is a static String"; //靜態變量 public String instanceString = "this is a instance String";//實例變量 //靜態方法 public static void staticMethod(){ System.out.println("this is a static method"); } //實例方法 public void instanceMethod(){ System.out.println("this is a instance method"); } }
public class Main { public static void main(String[] args){ TestStatic testStatic = new TestStatic(); TestStatic.staticMethod();//直接通過類名訪問靜態方法 System.out.println(TestStatic.staticString);//直接通過類名訪問靜態變量 testStatic.instanceMethod();//通過實例化對象 訪問 實例方法 System.out.println(testStatic.instanceString);//通過實例化對象 訪問實例變量 } }
1.靜態變量與靜態方法,上面TestStatic.java中
java中的變量有靜態變量和實例變量,實例變量要類實例化后才真正存在,通過對象.變量名訪問,如上面代碼中的testStatic.instanceString。靜態變量不需要實例化就存在,可以通過類名.變量名訪問,如上面的TestStatic.staticString
靜態方法和實例方法,無論哪種方法在內存中都只有一份。不同的是
a.實例方法必須通過實例化對象來使用如上面代碼中的testStatic.instanceMethod(),靜態方法是可以直接通過類名直接使用,如上面代碼中的TestStatic.staticMethod()
b.靜態方法可以有自己的自己的局部變量,只能訪問靜態變量和靜態方法,實例方法則沒有這種限制。實例如下
public class TestStatic { public static String staticString = "this is a static String"; //靜態變量 public String instanceString = "this is a instance String";//實例變量 //靜態方法 public static void staticMethod(){ int temp;//可以有自己的局部變量 staticString = "test";//可以訪問靜態成員變量 testStatic();//可以訪問靜態方法 //instanceMethod();//不能訪問實例方法 //instanceString = "";//不能使用實例變量 System.out.println("this is a static method"); } //實例方法 public void instanceMethod(){ System.out.println("this is a instance method"); } public static void testStatic(){ //用於測試 } }
2.靜態代碼段
static{ int x;//只在本塊有效 //靜態代碼段 }
a. 靜態代碼塊只能定義在類里面,它獨立於任何方法,不能定義在方法里面
b.靜態代碼塊里面的變量都是局部變量,只在本塊內有效
c.靜態代碼塊會在類被加載時自動執行,而無論加載者是JVM還是其他的類
d. 一個類中允許定義多個靜態代碼塊,執行的順序根據定義的順序進行
e.靜態代碼塊只能訪問類的靜態成員,而不允許訪問實例成員
3.java中的初始化順序
JAVA類首次裝入時,會對靜態成員變量或方法進行一次初始化,但方法不被調用是不會執行的,靜態成員變量和靜態初始化塊級別相同,非靜態成員變量和非靜態初始化塊級別相同。
初始化順序:先初始化父類的靜態代碼--->初始化子類的靜態代碼-->
(創建實例時,如果不創建實例,則后面的不執行)初始化父類的非靜態代碼(變量定義等)--->初始化父類構造函數--->初始化子類非靜態代碼(變量定義等)--->初始化子類構造函數
類只有在使用New調用創建的時候才會被JAVA類裝載器裝入創建類實例時,首先按照父子繼承關系進行初始化類實例創建時候,首先初始化塊部分先執行,然后是構造方法;然后從本類繼承的子類的初始化塊執行,最后是子類的構造方法類消除時候,首先消除子類部分,再消除父類部分