歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

對於Java類加載過程中的順序問題探究

以前記得static代碼塊貌似是Java類加載過程中優先級最高的,但是最近幾天寫代碼發現不是這樣的,因為static變量的優先級要比static代碼塊高得多,所以因此我犯了不少錯誤,下面以一個例子來說明一下一個類初始化為對象的時候的加載過程

  1. package com.bird.jdbc;  
  2.   
  3.   
  4. public class Test {  
  5.       
  6.       
  7.     private static A a = new A();  
  8.     private final static F f= new F();  
  9.     private B b = new B();  
  10.       
  11.     static{  
  12.         System.out.println("c");  
  13.     }  
  14.       
  15.     public Test(){  
  16.         System.out.println("Test");  
  17.     }  
  18.       
  19.     public static void main(String[] args){  
  20. //      Test t = new Test();   
  21.         try {  
  22.             Class.forName("com.bird.jdbc.Test");  
  23.         } catch (ClassNotFoundException e) {  
  24.             // TODO Auto-generated catch block   
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28. }  
  29.   
  30. class A{  
  31.     public A(){  
  32.         System.out.println("A");  
  33.     }  
  34. }  
  35.   
  36. class B{  
  37.     public B(){  
  38.         System.out.println("B");  
  39.     }  
  40. }  
  41.   
  42.   
  43. class F{  
  44.     public F(){  
  45.         System.out.println("F");  
  46.     }  
  47. }  

大家可以看到,直接運行Test t = new test();這句話,運行結果為

  1. A  
  2. F  
  3. c  
  4. B  
  5. Test  

所以是先static變量,然後是static的代碼塊,然後才是普通變量,最後是構造函數

如果是運行Class.forName()函數的話,運行結果為

  1. A  
  2. F  
  3. c  

還是這樣,先是static變量,然後才是static代碼塊,所以那種對於class.Forname加載類,只調用static代碼塊的誤區要克服,因為還有一個static代碼塊在等著你,呵呵,我得記錄下來以示警戒。

Copyright © Linux教程網 All Rights Reserved