java静态代码块 类加载顺序问题。

classBextendsObject{static{System.out.println("LoadB");}publicB(){System.out.println(... 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;
有一点不明白,为什么是先加载B类后加载A类;
我的理解是主函数运行到A a = new A();这句话的时候,发现构造对象a需要用到类A这个模板,所以就将类A加载到内存中,加载过程中其内部的静态代码块被执行,输出Load A,模板准备好后,接下来就是真正构造对象a了,调用构造方法A(),该构造方法内隐含的第一条语句是super();所以调用super();即构造父类对象,但发现内存中没有用于构造父类对象的模板(B类),所以又将B类加载到内存中来,加载过程中执行B类中的静态代码,输出Load B;待B类模板在内存中准备好后,就可以构造B类对象了,所以调用构造方法B();输出Create B; 接着回到A类的构造方法,执行super();后面紧接着的语句,即输出Create A;
所以顺序为Load A-->Load B-->Create B-->Create A;
这是为什么?哪里理解错了,请高人帮忙解答。
展开
 我来答
SWkissme
2013-09-21 · TA获得超过430个赞
知道小有建树答主
回答量:181
采纳率:88%
帮助的人:82.9万
展开全部
原因就是一句话:先有了父亲,才会有儿子!
程序运行时,加载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就太差劲了,你说呢?
woshilshwoshi
2013-09-21 · TA获得超过182个赞
知道答主
回答量:115
采纳率:100%
帮助的人:33.1万
展开全部
Java创建对象的时候,系统会为该对象的所有实例分配内存,但这个的前提是该类已经加载了,所以您这个问题理解的时候应该也是父类要先加载的!不知道有没有理解错呢

我的理解是:执行A的时候,B还没出现,也就是父亲不在,孩子A就不可能出现,所以这个时候必须父亲在,也就是执行B
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
瓶子快到碗里来
2013-09-21 · TA获得超过238个赞
知道答主
回答量:247
采纳率:0%
帮助的人:143万
展开全部
第一点,如果该类的直接父类没有初始化,则先初始化其直接父类。

第二点,如果该类中有初始化语句,则系统一次执行这些初始化语句。static{}属于静态初始化块。这道题主要考查的是类的加载。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
流程观察站
2013-09-21 · 信息化工作流管理,业务流程管理解决方案
流程观察站
采纳数:4 获赞数:22

向TA提问 私信TA
展开全部
父子类加载的时候是先加载父类再加载子类的,所以是Load B-->Load A-->Create B-->Create A;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
han5666892
2013-09-21 · TA获得超过169个赞
知道小有建树答主
回答量:214
采纳率:0%
帮助的人:161万
展开全部
继承类,先加载父类才会有子类的体现。你也可以理解为,没这个爸就没有这个儿子了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式