静态代码初始化
package com.learn;public class Test01 {/*** 比如我賦值叫500* 這里也要定義為靜態的*/
// private static int age = 500;/*** 靜態代碼塊你們聽過沒有* 聽說過吧*/static {/*** 靜態代碼塊初始化* 它是為2* 這個步驟是怎么樣進行執行的* 代碼是怎么進行執行的* 怎么執行* 什么順序* */System.out.println("2靜態代碼塊初始化");/*** 我能不能應用age* 我把它賦值700*/age = 700;}/*** 這個能不能放在下面* 這個時候是多少* 是500* 編譯器自動收藏類中的所有變量的賦值動作和靜態語句塊static塊中的語句合并產生* 代碼從上往下執行* 這肯定是500不是700的* 這個也沒有特別高達上* 答錯也沒關系* 如果我長期沒搞我也會答錯的* 忘記很正常的* * 500的原理是因為靜態代碼塊和全局變量的時候* 會做一個合并執行* 具體多少* 會和你的執行順序有關* 如果我放到上面* 那就會先執行age等于500* 然后靜態static里面會把age值賦值為700* 這樣的話age就為700了* * * 如果放到下面* 編譯器就會從上往下執行* age一開始的默認值是為0* 當你age值設置為700的情況下* 又改為500了* 你再打印的時候值肯定就為500了* 這個其實為JAVA基礎* * 它是先int age = 0;* static代碼塊里面把age = 700* 然后走到這一行的時候age = 500* * 有人會認為你靜態代碼塊前面age沒有初始化肯定報錯* 其實JVM做了一個優化* int age = 0* 走到靜態代碼塊的時候age的值等于700* 然后走到這一行的時候age就等于500了* * */private static int age = 500;/*** 我們把我們的構造函數也打印出來*/public Test01() {/*** 這個時候我們寫一下叫做什么* 構造函數初始化* 這個你們都學過的* 這個我倒不用講的特別細* * 我標記幾個步驟* 它是為1*/System.out.println("1構造函數.....");}/*** 我們再寫一個main函數出來*/public static void main(String[] args) {/*** new一下這個類* 你們可以說一下大體的結果*/Test01 t = new Test01();/*** 比如我這里new兩個* 這個叫t2* 這個時候代碼是怎么打印的* 2,1,1,500* static難道不會初始化兩次嗎* 靜態只初始化一次的* */Test01 t2 = new Test01();/*** age的結果是多少* 是500還是700你們說一下* 肯定是2,1* 靜態肯定是優先于構造方法* */System.out.println(t.age);}
}
?
總結