<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    千里冰封
    JAVA 濃香四溢
    posts - 151,comments - 2801,trackbacks - 0

    記得在剛學JAVA的時候,類的加載機制和初始化順序經(jīng)常被弄的糊里糊涂,其實當我們不太了解某些事情的時候,不防去做一做實驗,讓代碼的運行結(jié)果說話,這或許能幫助我們更好地了解一些事情.今天我們就用一些代碼來看一下類是如何被加載的,并且當有繼承關(guān)系的時候,類的加載順序又是怎么樣的.

    先看代碼吧

    /*
     * Test4.java
     * 
     * Created on 2007-9-21, 9:33:31
     * 
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     
    */

    package test1;

    /**
     *
     * 
    @author hadeslee
     
    */
    public class Test4 {
        
    private void testClassForName(String name) throws ClassNotFoundException{
            Class c
    =Class.forName(name);
        }
        
    private void testNewInstance(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
            Class c
    =Class.forName(name);
            Object obj
    =c.newInstance();
            System.out.println(obj);
        }
        
    public static void main(String[] args)throws Exception {
            Test4 t
    =new Test4();
            t.testClassForName(
    "test1.B");
            
    new B();
            
    new B();
        }
    }
    class A{
        
    private int aj;
        {
            aj
    =20;
            System.out.println(
    "A成員初始化塊");
        }
        
    private static int ai;
        
    static {
            ai
    =10;
            System.out.println(
    "A靜態(tài)初始化塊");
        }
        
    public A(){
            System.out.println(
    "A構(gòu)造函數(shù)");
        }
    }
    class B extends A{
        
    private static int bi;
        
    static {
            bi
    =30;
            System.out.println(
    "B靜態(tài)初始化塊");
        }
        
    private  int bj;
        {
            bj
    =40;
            System.out.println(
    "B成員初始化塊");
        }
        
    public B(){
            System.out.println(
    "B構(gòu)造函數(shù)");
        }
    }

    在代碼里面我們總共有三個類,一個是做測試用的Test4,一個是A,一個是A的子類B,我們在A和B類里面都有很多輸出,一個是靜態(tài)初始化的輸出,一個是成員初始化的輸出,一個是在構(gòu)造函數(shù)里面的輸出,從這些輸出我們可以知道代碼的執(zhí)行順序,以上代碼運行輸出如下:

    A靜態(tài)初始化塊
    B靜態(tài)初始化塊
    A成員初始化塊
    A構(gòu)造函數(shù)
    B成員初始化塊
    B構(gòu)造函數(shù)
    A成員初始化塊
    A構(gòu)造函數(shù)
    B成員初始化塊
    B構(gòu)造函數(shù)


    從上面我們可以看出,A和B的靜態(tài)初始化塊只被執(zhí)行了一次,也就是類的對象將要被生成的時候,它會執(zhí)行,并且執(zhí)行的順序如下:父類的靜態(tài)成員,子類的靜態(tài)成員,父類的成員變量和構(gòu)造方法,子類的成員變量和構(gòu)造方法.當再用這個類生成對象的時候,靜態(tài)的部份就不再被調(diào)用了.因為靜態(tài)是類的所有實例所共享的,所以它在整個虛擬機的生命周期內(nèi)只執(zhí)行一次.

    如果我們加上一個t.testClassForName("test1.B");放在main函數(shù)的最后面,我們會發(fā)現(xiàn)輸出還是和剛剛一樣,沒有任何改變,這個時候,我們知道,當我們調(diào)用Class.forName(name);的時候,類是不會自動初始化的,它默認只是把這個類的字節(jié)碼讀入內(nèi)存,但是并沒有初始化這個類.只有我們調(diào)用了newInstance()的時候,它才會被初始化.在這里我們再這樣試一下:把A和B生成的class文件去掉,然后再分別調(diào)用Class.forName和new B(),看看會怎么樣,我們會發(fā)現(xiàn)當我們調(diào)用Class.forName的時候,當我們要for的Name找不到的時候,只會拋出ClassNotFoundException,注意,它只是一個異常而已,而當我們new B()的時候,B的class文件卻被我們刪掉了,那就事大了,那就將拋出NoClassDefFoundError,呵呵,它就是一個Error了,這點區(qū)別我們可要注意啦,當我們在做這些事情的時候,一個只要捕獲異常就可以了,一個卻需要捕獲一個Error,一般來說,Error級別的錯誤是不希望程序員去捕獲的.了解了類的基本加載順序以及加載機制后,對我們了解JAVA是有一定的幫助的.好了,先講這些吧,有關(guān)類的加載機制以后再繼續(xù)分享:)


    盡管千里冰封
    依然擁有晴空

    你我共同品味JAVA的濃香.
    posted on 2007-09-21 09:59 千里冰封 閱讀(1676) 評論(2)  編輯  收藏 所屬分類: JAVASE

    FeedBack:
    # re: 類加載機制初探
    2007-09-21 13:34 | 久城
    哈哈,讓我想起三個月前,我的畢業(yè)設(shè)計就是這個...  回復  更多評論
      
    # re: 類加載機制初探
    2008-01-25 00:24 | damagegod
    畢業(yè)設(shè)計寫這個?  回復  更多評論
      
    主站蜘蛛池模板: 亚洲愉拍99热成人精品热久久| 久久99精品国产免费观看| 青娱乐免费在线视频| 337p日本欧洲亚洲大胆精品555588| 精品免费久久久久国产一区| 日本大片在线看黄a∨免费| 久久久国产亚洲精品| 欧美大尺寸SUV免费| 日本高清色本免费现在观看| 亚洲娇小性xxxx色| 免费电视剧在线观看| 亚洲国产亚洲片在线观看播放 | 热99re久久免费视精品频软件| 亚洲资源最新版在线观看| 久久成人国产精品免费软件| 亚洲一区二区三区久久| 青草草在线视频永久免费| 羞羞视频免费网站含羞草| 亚洲国产一成久久精品国产成人综合 | 免费夜色污私人影院网站| 亚洲成a人片在线播放| 一区二区三区免费高清视频| 亚洲自偷自偷偷色无码中文| 99免费精品视频| 亚洲国产成人手机在线电影bd| 日本一区二区三区免费高清 | 一级毛片大全免费播放下载| 亚洲自偷自偷偷色无码中文| 青青草无码免费一二三区| 亚洲国产精品乱码在线观看97| 四虎在线免费播放| 四虎影视永久在线精品免费| 亚洲av中文无码乱人伦在线播放 | 国偷自产一区二区免费视频| 久久久久久亚洲AV无码专区| 我要看免费的毛片| 黄视频在线观看免费| 亚洲国产亚洲片在线观看播放| 免费一级毛片在播放视频| 日本不卡免费新一区二区三区| 亚洲中文字幕无码亚洲成A人片|