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