1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载。
例子:直接上两个例子
public class CarFactory {
public static void main(String[] args) {
if("Jeep".equals(args[0])){
Jeep jeep=new Jeep();
jeep.start();
}
if("BYD".equals(args[0])){
BYD byd=new Byd();
byd.start();
}
}
}
以上代码如果在编译时候,缺少Jeep或者BYD任何一个类,编译都会报错,即使你现在暂时只想用Jeep,没有BYD。再看反射的代码
public class CarFactory {
public static void main(String[] args) {
try{
Class c=Class.forName(args[0]);//动态加载类,运行时刻加载类
Car car=c.newInstance();//car是接口,所有汽车实现该接口,都有start方法
car.start;//启动,多态机制
}catch (Exception e) {
// TODO: handle exception
}
}
}
以上代码是第一段代码的改进,即使只有Jeep类,也能使用,编译时候不会报错。后面可以随便添加Car,扩展性好