以前記得static代碼塊貌似是Java類加載過程中優先級最高的,但是最近幾天寫代碼發現不是這樣的,因為static變量的優先級要比static代碼塊高得多,所以因此我犯了不少錯誤,下面以一個例子來說明一下一個類初始化為對象的時候的加載過程
- package com.bird.jdbc;
-
-
- public class Test {
-
-
- private static A a = new A();
- private final static F f= new F();
- private B b = new B();
-
- static{
- System.out.println("c");
- }
-
- public Test(){
- System.out.println("Test");
- }
-
- public static void main(String[] args){
- // Test t = new Test();
- try {
- Class.forName("com.bird.jdbc.Test");
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
-
- class A{
- public A(){
- System.out.println("A");
- }
- }
-
- class B{
- public B(){
- System.out.println("B");
- }
- }
-
-
- class F{
- public F(){
- System.out.println("F");
- }
- }
大家可以看到,直接運行Test t = new test();這句話,運行結果為
- A
- F
- c
- B
- Test
所以是先static變量,然後是static的代碼塊,然後才是普通變量,最後是構造函數
如果是運行Class.forName()函數的話,運行結果為
- A
- F
- c
還是這樣,先是static變量,然後才是static代碼塊,所以那種對於class.Forname加載類,只調用static代碼塊的誤區要克服,因為還有一個static代碼塊在等著你,呵呵,我得記錄下來以示警戒。