java靜態變量、靜態方法和靜態代碼段


先上實例

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類裝載器裝入創建類實例時,首先按照父子繼承關系進行初始化類實例創建時候,首先初始化塊部分先執行,然后是構造方法;然后從本類繼承的子類的初始化塊執行,最后是子類的構造方法類消除時候,首先消除子類部分,再消除父類部分

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM