Class.forName(类的全称);不仅表示类的类类型也表示动态加载类
要区分编译和运行 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类
new创建对象 是静态加载类 在编译刻就需要加载可能用到的类
所以我们希望用动态加载类 那么如何加载呢?
首先创建OfficeBetter.java
class OfficeBetter{
public static void main(String[] args){
try{
//动态加载类,在运行时刻加载
Class c=Class.forName(args[0]);
}catch(Exception e)
{e.printStackTrace();}
}
}
此时编译不会报错因为他不管你将要用到哪些类 但是当你运行时要用到具体的类了,如果没有则会报错 如下编译没问题 运行时需要用到Excel类 但是找不到
接下来创建对象
class OfficeBetter{
public static void main(String[] args){
try{
//动态加载类,在运行时刻加载
Class c=Class.forName(args[0]);
/*通过类类型创建对象 (注意要往将要加载的类做强制转换),但是用到的类不同就有不同的转换,例如往Word做转换:Word w=(Word)c.newInstance();但是加载的类是Excel怎么办; 往Excel做转换:Excel e=(Excel)c.newInstance();但是加载的类是Word怎么办
所以要想让他们都能在这里用 就要给他们统一标准
*/
OfficeAble oa=(OfficeAble)c.newInstance();
Oa.start();
}catch(Exception e)
{e.printStackTrace();}
}
}
接下来给Word和Excel制定一个共同的标准
创建接口 OfficeAble.java
Interface OfficeAble
{
Public void start();
}
这样的话就可以oa.start()了
创建Word.java 并让其遵循标准
class Word implementsOfficeAble
{
Public static void start()
{System.out.println(“Word….starts….”);}
}
创建Excel.java 并让其遵循标准
class Excel implements OfficeAble
{
Public static void start()
{System.out.println(“Excel….starts….”);}
}