對于Java類加載過程中的順序問題探究
以前記得static代碼塊貌似是Java類加載過程中優(yōu)先級最高的,但是最近幾天寫代碼發(fā)現(xiàn)不是這樣的,因?yàn)閟tatic變量的優(yōu)先級要比static代碼塊高得多,所以因此我犯了不少錯(cuò)誤,下面以一個(gè)例子來說明一下一個(gè)類初始化為對象的時(shí)候的加載過程:
- 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");
- }
- }
大家可以看到,直接運(yùn)行Test t = new test();這句話,運(yùn)行結(jié)果為
- A
- F
- c
- B
- Test
所以是先static變量,然后是static的代碼塊,然后才是普通變量,最后是構(gòu)造函數(shù)
如果是運(yùn)行Class.forName()函數(shù)的話,運(yùn)行結(jié)果為
- A
- F
- c
還是這樣,先是static變量,然后才是static代碼塊,所以那種對于class.Forname加載類,只調(diào)用static代碼塊的誤區(qū)要克服,因?yàn)檫€有一個(gè)static代碼塊在等著你,呵呵,我得記錄下來以示警戒。
原文鏈接:http://blog.csdn.net/a352193394/article/details/7255277
【編輯推薦】