首先写一个Office类
public class Office
{
public static void main(String[] args)
{
if("Word".equals(args[0]))
{
Word word = new Word();
word.start();
}
if("Excel".equals(agrs[0]))
{
Excel excel = new Excel();
excel.start();
}
}
}
class Word
{
public void start(){};
}
编译时会报错
我们只想用Word类,然而当我们没有创建Excel类时,编译也不能通过。
原因 : 用new 创建对象会在编译时加载所有可能用到的对象,所以,当无法创建Excel对象时会编译出错
静态加载:在编译时进行加载
如果我们想使用Word时,就加载Word类,使用Excel时就加载Excel类,解决的方法是动态加载
动态加载:运行时进行加载
看改进后的代码
public class OfficeBetter
{
public static void main(String[] args)
{
try
{
Class c = Class.forName(args[0]);
FatherOffice office = (FatherOffice)c.newInstance();
office.start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
interface FatherOffice
{
public void start();
}
class Word implements FatherOffice
{
public void start()
{
System.out.println("word---start");
}
}
具体关于Class类实例化问题,见《Class类的使用(上)》。
使用动态加载,即使我们没有创建Excel对象,编译也不会出现问题
只有以Excel作为参数运行时,才会出现错误。
当我们添加了Excel类之后,不需要再次编译OfficeBetter.java文件,便可运行。
注:像qq等应用程序的在线升级,都是使用动态加载新的方法,之前的功能代码不需要改动,只要在此基础上编译新加的功能再运行即可
一般功能性的类尽量使用动态加载方法,实现功能的独立性。