new 创建对象,是在编译时静态加载类,需要加载所有可能用到的类
123
。。。
动态加载方式
Class.forName(类的全称) 代表了动态加载类
编译时刻加载类时静态加载类
运行时刻加载类是动态加载类
new创建对象是静态加载类,在编译时刻就需要加载所有可能使用的类
动态加载类,在运行时加载,再通过类类型创建类型对象
这里实现了不需要再次编译.
也就实现了所谓的"动态".
这里太经典了. 是"接口"使用的具体场景. 也就是"提取公共/抽象的部分".
这里是"运行时报错"的实例(也就是控制台报错).
但是编译时不报错.
当然 报错的原因是找不到forName里的的参数所指向的"类"
这里用Class.forName方法实现"动态加载类".
new 创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类.
class Excel implements OfficeAble { public void start() { System.out.println("excel..starts.."); } }
class OfficeBetter { public static void main(String[] args) { try { Class c = Class.forName(args[0]); OfficeAble oa = (OfficeAble)c.newInstance(); oa.start(); } } }
class Word { public static void start() { System.out.println("word..starts.."); } }
class Office { public static void main(String[] args) { if("Word".equals(args[0]) { Word w = new Word(); w.start(); } if("Excel".equals(args[0])) { Excel e = new Excel(); e.start(); } } }
使用该方法,main的主文件只需编译一次。
后面只需添加新的类对象文件实现接口,然后在运行时添加参数即可。
其中一中类对象Excel的代码
OfficeAble接口代码
动态加载类,在运行时刻加载
Class c = Class.forName(args[0]);
通过类类型,创建该类对象
OfficeAble oa = (officeAble)c.newInstance(); //officeAble为一个接口,里面有start方法
oa.start;
Class.forName("类的全称")
不仅表示了类的类类型,还代表了动态加载类。
编译时加载类是静态加载类,运行时加载类是动态加载类。
Class aClass = Class.forName("完整的类名");
//调用类类型进行实例化时,类中必须有无参的构造函数
aClass.newInstace();
静态类似一次性?
动态则可回收?
(暂时还不知道该如何理解,等以后理解更深了再回头看看这个问题,如果有大佬看到这个笔记也可以私聊告诉我一声,麻烦了。
编译时刻加载类是静态加载类.
运行时刻加载类是动态加载类.
new 创建对象是静态加载类:
编译时需将其中所有的类加载进来,如共有100个类,其中出现1个类有问题,其他99个类均不能正常加载。例如:
/*如需求去掉Excel类功能,但保留Word功能,代码中Word在前,则此时Word功能也无法执行*/
if("Word".equals(arg[0])){
Word w = new Word();
}
if("Excel".equals(args.[0])){
Excel e = new Excel();
}
2.动态加载:用哪个就加载哪个,不用不加载
Class OfficeBetter{
publice void static main(String[] args){
//动态加载类,在运行时刻加载
Class c = Class.forName(args[0]);
//通过返回类类型,创建该类对象
类名 待建类名 = (类名) c.newInstance();
待建类名.start();
}
}
【注意】
//下面一行可用Interface编写标准,防不同类做强制转换时报错
*********类名 待建类名 = (类名) c.newInstance();*************
//例如:
OfficeAble oa = (OfficeAble) c.newInstance();
//新建一个接口文件:
interface OfficeAble{
public void start();
}
//让接口在待强制转换类型的类中生效
class Word implements OfficeAble{
public static void start(){
System.out.println("This is Word");
}
}
//不被转换类型的类不生效OfficeAble接口
class Excel{
publice static start(){
System.Out.println("This is Excel");
}
}
//则 OfficeAble oa = (OfficeAble) c.newInstance(); 就会自动创建Word类的对象,而不创建Excel类的对象
Class.forName("类的全称"):
1、不仅表示了类类型,还表示了动态加载类
2、区分编译,运行
3、编译时加载类是静态加载类、运行时加载类是动态加载类
2.55555555555555555
333333333
2222222
11111111111
new 创建对象 是静态加载类,在编译时刻就需要加载所有可能使用到的类
动态加载 运行时加载,用哪个加载那个类