对于类的加载有两种
- 静态加载:编译时加载类
- 动态加载:通过Class.forName(“类的全称”)可以在运行时刻加载一个类
例如:有Word、Excel两个类(将来也许有PPT类)如果希望运行时刻在Office类中使用Word或者Excel对象,就可以这样:
Class c = Class.forName("Word");
Word word = (Word)c.newInstance();
或者
Class c = Class.forName("Excel");
Excel excel = (Excel)c.newInstance();
然后调用Word(或者Excel)的方法。
因为不能预先知道需要实例化的对象是Word还是Excel,所以强制类型转换时并不能很好的选取要实例化的类。
因此,我们可以让Word,Excel都去实现接口OfficeAble,从而可以将代码改为
OfficeAble oa = (OfficeAble)c.newInstance();
然后就可以调用 oa 中的方法,从而不必去理会需要实例化的是Word还是Excel,因为父类引用可以指向子类实例对象
如果将来要实例化的是PPT,只要PPT去实现接口OfficeAble即可像使用Word那样在运行时刻实例化PPT的对象
Office.java
public class Office{
public static void main(String []args){
try{
Class c = Class.forName(args[0]);
OfficeAble oa = (OfficeAble)c.newInstance();
oa.start();
}catch(Exception e){
e.printStackTrace();
}
}
}
OfficeAble.java
interface OfficeAble{
public void start();
}
Word.java
public class Word implements OfficeAble{
public void start(){
System.out.println("word");
}
}
Excel.java
public class Excel implements OfficeAble{
public void start(){
System.out.println("excel");
}
}