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