java静态代码块 类加载顺序问题。
2016-04-11 12:52
483 查看
class B extends Object { static {System.out.println("Load B");} public B(){ System.out.println("Create B");} } class A extends B { static {System.out.println("Load A");} public A(){ System.out.println("Create A");} } public class Test { public static void main(String[] args){ A a = new A(); } } 这是alibaba笔试题,求输出的顺序? 答案为Load B-->Load A-->Create B-->Create A;
原因就是一句话:先有了父亲,才会有儿子! 程序运行时,加载AB两类,因为A是B子类,所以先加载B类,Load B,再加在A类 LoadA, 调用A a = new A()代码时,会先调用其父类B的构造方法 Create B 再调用A的构造方法 Create A
追问:
先有父亲后有儿子,这句话不是只针对“构建对象”而言的吗,他也针对“类的加载”吗?我的理解是:对于构建对象的话, 的确是应该先构建父类对象,才能构建子类对象。但对于类的加载的话 ,不应该是看到内存中缺少了哪个类就应该加载哪个类的吗?
追答:
加载的时候也是一样的,当加载类A的时候,发现有父类B,就去搜索并加载B了, 这个时候还没有加载A中那些静态块,等B加载完了之后,才会返回来加载A, 也只有这样,程序才知道A中到底会有些什么方法,因为A中存在着由B继承而来的方法。 如果先加载了A,那么就会出现两种情况,一种是A中没有继承而来的方法, 另一种是加载B后再一次加载A继承而来的方法,那这样的Java就太差劲了,你说呢? 可参考:http://blog.csdn.net/qiyeliuli/article/details/54867055(写的很好)
java之继承中的构造方法:继承构造器调用
http://www.cnblogs.com/Gaojiecai/p/4004782.htmljava 重载、重写、构造函数详解
https://www.cnblogs.com/0201zcr/p/4853283.html相关文章推荐
- LeetCode 191 -Number of 1 Bits ( JAVA )
- 一个基于RSA算法的Java数字签名例子
- java Transient关键字的使用
- Eclipse开发前,常用设置
- 冒泡排序(java实现)
- 学习Spring.Net_1
- Eclipse切换SVN用户
- Android studio 类似于eclipse 中的 Ctrl+1 快捷键(quick fixes available)
- SpringMVC和struts2的比较
- 关于Class.getResource和ClassLoader.getResource的路径问题
- java积累(一)------后端---Comparator比较器的用法
- java积累(一)------后端---Comparator比较器的用法
- Java的getClass()
- Java的getClass()
- 8、spring mvc
- Java学习——运算顺序的详细挖掘
- Java transient关键字小记
- SSH框架 spring 配置中的: scope="prototype"
- Spring Web MVC实现Restful Web Service
- java 为什么匿名内部类和局部内部类只能访问final变量