当前位置:编程学习 > JAVA >>

java新手求助,不明白这段代码的构造器调用顺序,求解释



/**
 * Description:
 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> 
 * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author Yeeku.H.Lee kongyeeku@163.com
 * @version 1.0
 */
class Root
{
static{
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root()
{
System.out.println("Root的无参数的构造器");
}
}
class Mid extends Root
{
static{
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid()
{
System.out.println("Mid的无参数的构造器");
}
public Mid(String msg)
{
//通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:"
+ msg);
}
}
class Leaf extends Mid
{
static{
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf()
{
//通过super调用父类中有一个字符串参数的构造器
super("疯狂Java讲义");
System.out.println("执行Leaf的构造器");
}
}
public class Test
{
public static void main(String[] args) 
{
new Leaf();
new Leaf();
}
}
--------------------编程问答-------------------- Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:疯狂Java讲义
Leaf的普通初始化块
执行Leaf的构造器
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:疯狂Java讲义
Leaf的普通初始化块
执行Leaf的构造器
--------------------编程问答-------------------- 如果你深入编译器内部的话,你可以发现的是在构造函数之前会先执行类里面的静态块
对于子类来说,在编译器内部实现的时候会将子类里的静态块扩展,扩展成先调用父类的静态块
对于非静态块,即普通块,编译器实现时会将其放放构造函数中,也就是在构造函数一开始时就调用普通
块里的方法,然后是随后构造函数里的方法
因此对于一个无继承的类,执行是静态块->普通块/属性的赋值->构造函数
有继承时,对上述扩展 --------------------编程问答--------------------
引用 1 楼 beer_wang 的回复:
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:疯狂Java讲义
Leaf的普通初始化块
执行Leaf的构造器
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:疯狂Java讲义
Leaf的普通初始化块
执行Leaf的构造器


请问一下mid的带参数的构造器的值是怎么传过去的,这时候不是还没有执行leaf的吗?

引用 1 楼 beer_wang 的回复:
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:疯狂Java讲义
Leaf的普通初始化块
执行Leaf的构造器
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:疯狂Java讲义
Leaf的普通初始化块
执行Leaf的构造器
--------------------编程问答-------------------- 还有为什么leaf()里的super(疯狂java讲义)没有输出,这句是怎么执行啊 --------------------编程问答--------------------
引用 4 楼 jipinerliuzi 的回复:
还有为什么leaf()里的super(疯狂java讲义)没有输出,这句是怎么执行啊


构造器是从下向上追寻的,值也是在这过程中传过去的,然后执行是从上向下开始执行。
上面的话欠妥,但你可暂时就这样理解,呵呵。
super在构造器里的意思是调用父类的构造器执行。
执行super("疯狂Java讲义");时,会调用执行父类Mid中
public Mid(String msg)
{
//通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:"
+ msg);
}
}
此时,this();又会调用Mid类中的
public Mid()
{
System.out.println("Mid的无参数的构造器");
}

这些你可以手动执行一下看看,成功后,可以修改代码,再执行,对比一下结果
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,