java之靜態加載和動態加載類

    java語言是先把Java源文件編譯成後綴爲class的字節碼文件,而後再經過ClassLoader機制把這些類文件加載到內存中,最後生成實例執行
    
    靜態加載:程序編譯時就自動加載全部的類
    對象的生成通常通過兩個步驟:
    一、加載到內存中生成Class的實例對象
    二、經過new關鍵字生成對象
    
    動態加載:程序運行時經過Class.forName方法進行動態加載,加載類的過程當中會初始化該類的static變量和代碼塊等,非static類型對於forName而言僅加載類, 並不執行任何代碼
   動態加載的意義:加載一個類會初始化該類的static變量和代碼塊等,非static類型對於forName而言僅加載類, 並不執行任何代碼java

//例一    
    public class Test54
{ide

    public static void main(String[] args)
        throws Exception
    {
        // 動態加載,絕對路徑--運行時
        Class.forName("Utils");
    }.net

}對象


class Utils
{
    public static final String NAME = "這是個人地盤";內存

    // 靜態代碼塊
    static
    {
        System.out.println("Do Something");
        System.out.println(NAME);
    }
}get

運行結果:
Do Something
這是個人地盤io

 


    
//例二    
public class Test54
{編譯

    public static final String CAT = "Cat";class

    public static final String DOG = "Dog";test

    public static void main(String[] args)
        throws Exception
    {
        Test54 test54 = new Test54();

        test54.noise(CAT);
    }

    @SuppressWarnings("rawtypes")
    public void noise(String animalClass)
    {
        try
        {
            // 動態加載,絕對路徑--運行時
            Class c = Class.forName(animalClass);
            Animal animal = (Animal)c.newInstance();
            animal.noise();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}


class Cat implements Animal
{

    @Override
    public void noise()
    {
        System.out.println("貓的叫聲:喵喵");
    }
}


class Dog implements Animal
{

    @Override
    public void noise()
    {
        System.out.println("狗的叫聲:汪汪");
    }
}


interface Animal
{
    void noise();
}
    
    
運行結果:
貓的叫聲:喵喵 

參照來源:《編寫高質量代碼:改善java程序的151建議》

相關文章
相關標籤/搜索