静态加载与动态加载

创建Office,使用javac命令进行编译,会报错Word和Office找不到符号,如果我们创建了Word类,对Word使用javac进行编译,然后对Office进行编译,发现只报Excel找不到的错误。假设我们只想用Word的功能,程序没法使用。用不了的原因是,因为程序是做类的静态加载,在编译时刻就需要加载所有的可能使用到的类。在实际应用中,我们希望word存在,word就能用,用excel的时候才报错。这就是编译时刻加载导致的,new都是编译时刻加载。

class Office{
	public static void main(String[] args){
		//new 创建对象 是静态加载类,在编译时刻就需要加载所有的可能使用到的类。
		if("Word".equals(args[0])){
			Word word = new Word();
			word.start();
		}
		if("Excel".equals(args[0])){
			Excel excel = new Excel();
			excel.start();
		}
	}
}

通过动态加载可以解决该问题,在编译的时候,不会报错,只有在运行的时候才有可能报错。创建OfficeAble标准,Word和Office都实现这个接口,防止出现类型转换错误。现在使用java OfficeBetter Word,可以运行Word的方法,如果想运行Excel,只需要实现Excel这个类就行了,然后,OfficeBetter这个类不需要重新编译,直接运行即可。以后添加其他Office的实现,OfficeBetter这个类都不需要修改,只需要动态的加新的功能就可以了。功能性的类一般都使用动态加载,而不是静态加载。

class OfficeBetter{
	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();
		}
	}
}


interface OfficeAble{	
	public void start();
}

class Word implements OfficeAble{
	public void start(){
		System.out.println("Word start");
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章