麻烦先看代码
主要内容是关于静态初始化和构造器的执行顺序的问题
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("急速测试");
System.out.println("执行Leaf的构造器");
}
}
public class Test {
public static void main(String [] args)
{
System.out.println("test");
new Leaf();
new Leaf();
}
}
代码输出如下
test
Root的静态初始化代码块
Mid的静态初始化代码块
Leaf的静态初始化代码块
Root的普通初始化代码块
Root的无参数的构造器
Mid的普通初始化代码块
Mid的带参数构造器,其参数值为:急速测试
Leaf的普通初始化代码块
执行Leaf的构造器
Root的普通初始化代码块
Root的无参数的构造器
Mid的普通初始化代码块
Mid的带参数构造器,其参数值为:急速测试
Leaf的普通初始化代码块
执行Leaf的构造器
问题1
(此问题已经解决,谢谢)
我粗略了解载入Leaf类的时候,会先创建父类(直至java.lang.Object)的初始化代码和构造器,那么
他们的顺序是否如下:
Root类静态初始化代码块
-->Mid类静态初始化代码块
-->Leaf类静态初始化代码块
-->Root类普通初始化代码块
-->Root类构造器
-->...
-->Leaf类Root类普通初始化代码块
-->Leaf类的构造器
问题2
如果Leaf类的构造器的执行顺序在父类的构造器之后,那么为什么Mid类的有参数构造器已经被传入参数急速测试呢?
可能描述得不是很清楚,如果有疑问请指出来,我会尽量描述清楚的
感谢您抽空查看
慕妹3146593
相关分类