天天看點

java之靜态加載和動态加載類(隐式和顯式)

    java語言是先把Java源檔案編譯成字尾為class的位元組碼檔案,然後再通過ClassLoader機制把這些類檔案加載到記憶體中,最後生成執行個體執行

    靜态加載:程式編譯時就自動加載所有的類

    對象的生成一般經過兩個步驟:

    1、加載到記憶體中生成Class的執行個體對象

    2、通過new關鍵字生成對象

  動态加載:程式運作時通過Class.forName方法進行動态加載,加載類的過程中會初始化該類的static變量和代碼塊等,非static類型對于forName而言僅加載類, 并不執行任何代碼

  //例一    

    public class Test54

{

    public static void main(String[] args)

        throws Exception

    {

        // 動态加載,絕對路徑--運作時

        Class.forName("Utils");

    }

}

class Utils

{

    public static final String NAME = "這是我的地盤";

    // 靜态代碼塊

    static

    {

        System.out.println("Do Something");

        System.out.println(NAME);

    }

}

運作結果:

Do Something

這是我的地盤

//例二    

public class Test54

{

    public static final String CAT = "Cat";

    public static final String DOG = "Dog";

    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建議》