2.继承情况下Java初始化顺序
用代码和输出直接说明:
package com.kael;
/**
*
* @Title:Demo004
* @Description:
* @Copyright:Copyright (c) 2012
* @Date:2012-7-25
* @author feilong.li
*/
public class Initialization {
// 主函数
public static void main(String str[]) {
TA ta = new TA();
System.out.println("-------------------------");
TB tb = new TB();
}
}
class MainTest {
MainTest(String s) {
System.out.println(s);
}
MainTest() {
System.out.println("MainTest默认构造函数被调用");
}
}
class TA {
static MainTest mt = new MainTest("静态成员mt初始化");
MainTest mt1 = new MainTest("mt1成员初始化");
static {
System.out.println("static块执行");
mt = new MainTest("静态块内初始化sam成员变量");
}
TA() {
System.out.println("TA默认构造函数被调用");
}
}
class TB {
static MainTest mainTest1 = new MainTest("静态成员mainTest1初始化");
static {
System.out.println("static 块 1 执行");
}
MainTest mt1 = new MainTest("mt1成员初始化");
static MainTest mainTest2 = new MainTest("静态成员mainTest2初始化");
static {
System.out.println("static 块 2 执行");
}
TB() {
System.out.println("TB默认构造函数被调用");
}
MainTest mt2 = new MainTest("mt2成员初始化");
}
输出结果:
静态成员mt初始化
static块执行
静态块内初始化sam成员变量
mt1成员初始化
TA默认构造函数被调用
-------------------------
静态成员mainTest1初始化
static 块 1 执行
静态成员mainTest2初始化
static 块 2 执行
mt1成员初始化
mt2成员初始化
TB默认构造函数被调用
得出结论(执行顺序):
a 静态成员变量和static块首先被初始化,其执行顺序和其在类中申明的顺序有关
b 普通成员(实例变量)初始化
c 执行构造函数
2.继承情况下Java初始化顺序
用代码和输出直接说明:
package com.kael;
/**
*
* @Title:Demo004
* @Description:
* @Copyright:Copyright (c) 2012
* @Date:2012-7-25
* @author feilong.li
*/
public class Initialization {
// 主函数
public static void main(String str[]) {
TB tb = new TB();
}
}
class Sample {
Sample(String s) {
System.out.println(s);
}
Sample() {
System.out.println("Sample默认构造函数被调用");
}
}
class TA {
static {
System.out.println("父类static 块 1 执行");
}
static Sample staticSam1 = new Sample("父类 静态成员staticSam1初始化");
Sample sam1 = new Sample("父类 sam1成员初始化");
static Sample staticSam2 = new Sample("父类 静态成员staticSam2初始化");
static {
System.out.println("父类 static 块 2 执行");
}
TA() {
System.out.println("父类 Test默认构造函数被调用");
}
Sample sam2 = new Sample("父类 sam2成员初始化");
}
class TB extends TA {
static Sample staticSamSub = new Sample("子类 静态成员staticSamSub初始化");
TB() {
System.out.println("子类 TestSub 默认构造函数被调用");
}
Sample sam1 = new Sample("子类 sam1成员初始化");
static Sample staticSamSub1 = new Sample("子类 静态成员staticSamSub1初始化");
static {
System.out.println("子类 static 块 执行");
}
Sample sam2 = new Sample("子类 sam2成员初始化");
}
输出结果:
父类static 块 1 执行
父类 静态成员staticSam1初始化
父类 静态成员staticSam2初始化
父类 static 块 2 执行
子类 静态成员staticSamSub初始化
子类 静态成员staticSamSub1初始化
子类 static 块 执行
父类 sam1成员初始化
父类 sam2成员初始化
父类 Test默认构造函数被调用
子类 sam1成员初始化
子类 sam2成员初始化
子类 TestSub 默认构造函数被调用
得出结论(初始化顺序):
a 父类静态成员变量和static块首先被初始化,其执行顺序和其在类中申明的顺序有关
b 子类静态成员变量和static块被初始化,其执行顺序和其在类中申明的顺序有关
c 父类普通成员(实例变量)初始化
d 父类构造方法被调用
e 子类普通成员(实例变量)初始化
f 子类构造函数被调用