1.JAVA中的初始化和加载

[size=large]考虑有一个基类和一个子类的情况
那么,当实例化一个子类的对象或者访问子类的静态域或静态方法时,会进行类的加载.
[color=blue]程序首先会执行静态块的内容,这也就有了不写main方法就跑hello world的小故事[/color]
1)完成基类的static域和static块的初始化.
2)完成子类的static域和static块的初始化.
至此,如果只是访问子类的静态域或静态方法,到此初始化工作已经完成.
[color=blue]只有实例化子类的对象,才要继续初始化.[/color]
3)完成基类非static成员的默认初始化,即基本数据类型为0,对象类型为null,
然后完成基类非static成员的指定初始化,
最后完成构造器的初始化.
4)完成子类的初始化,流程跟基类的一样.

总结:
JAVA类加载顺序:
1).按代码顺序递归加载静态成员/代码块,先父类再本类;
2).按代码顺序递归加载非静态成员/代码块,先父类再本类;
3).按代码顺序递归调用构造函数,先父类再本类;
JAVA类加时机:
1).调用静态成员时,加载静态成员所在的类及父类(在实例化之前,会预先加载);
2).第一次new对象时加载(第二次new不再加载);
3).加载子类会先加载父类;


Java中forName与ClassLoader方法:

Class.forName:
当我们调用Class.forName(name)时,[color=blue]加载完成后立即执行静态初始化代码[/color]
其实是在方法内部调用了:
forName0(name, true, ClassLoader.getCallerClassLoader());

Class.forName(“xxxx”) 返回的是一个类, .newInstance() 后才创建一个对象 Class.forName(“xxxx”) 的作用是要求JVM查找并加载指定的类,[color=blue]也就是说JVM会执行该类的静态代码段。[/color]
Class aClass = Class.forName(xxx.xx.xx);
Object anInstance = aClass.newInstance();


ClassLoader:
ClassLoader loader = this.getClass().getClassLoader();
Class dog = loader.loadClass("Dog");
Animal an = (Animal)dog.newInstance();

[color=blue]loader完成以后并没有立即进行静态代码的执行。只有当newInstance()的时候才执行静态初始化[/color] 这相当于调用了
forName0(name, false, ClassLoader.getCallerClassLoader());[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值