非靜態代碼塊如:
以上代碼塊就是非靜態的代碼塊,請注意這里的方法名、作用域、返回值、參數一概沒有,非靜態代碼塊會在每次類被調用或者被實例化時就會被執行。
靜態代碼塊如:
- static {
- System.out.println("3");
- }
上面的代碼塊就是靜態的代碼塊,同樣沒有方法名、作用域、返回值以及參數,靜態代碼塊類似於靜態變量,不論類被調用多少次,該區域代碼只在第一次時執行一次
大家可以通過下面的代碼做進一步的測試
- public class test1 {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- new test1();
- new test1();
- }
- {
- System.out.println("2");
- }
- static {
- System.out.println("3");
- }
- public test1(){
- System.out.println("1");
- }
- }
輸出結果為
3
2
1
2
1
從結果中發現靜態代碼塊以及非靜態代碼塊都會在構造函數前執行,首次訪問時,靜態代碼塊會在非靜態代碼塊前執行
靜態代碼塊是在類加載時自動執行的,非靜態代碼塊是在創建對象時自動執行的代碼,不創建對象不執行該類的非靜態代碼塊