父类静态代码区和父类静态成员
子类静态代码区和子类静态成员
父类非静态代码区和普通成员
父类构造函数
子类非静态代码区和普通成员
子类构造函数
实例变量只有在创建对象的时候才会进行初始化。
非继承类加载顺序:
继承类加载顺序: 为了加深理解,转载一篇博客的分析。来自:http://blog.csdn.net/ooppookid/article/details/42967353一、总体原则
列出执行顺序的原则(这里本人出了简化,比较明了。可能有漏的,请帮忙补充,但应付该实例足以):
==父类先于子类;
==静态先于非静态;
==变量和块先于构造方法;
==变量声明先于执行(变量赋值、块执行);(这一点是根据数据在内存中是如何存储的得出的,基本类型、对象、String均不一样,但是总结起来应该是这样)
==变量赋值与块优先级相同;
==同优先级的从上至下执行;
二、实例
直接上题(小马哥的阿里,问:system.out打印结果。这里我加上了行号,方便解说):
- public class StaticTest {
- public static int k = 0;// 1
- public static StaticTest s1 = new StaticTest(“s1”);// 2
- public static StaticTest s2 = new StaticTest(“s2”);// 3
- public static int i = print(“i”);// 4
- public static int n = 99;// 5
- public int j = print(“j”);// 6
- {
- print(”构造块”);
- }// 7
- static {
- print(”静态块”);
- }// 8
- public static int print(String s) {
- System.out.println(++k + ”:” + s + “\ti=” + i + “\tn=” + n + “\tprint”);
- ++n;
- return ++i;
- }
- public StaticTest(String s) {
- System.out.println(++k + ”:” + s + “\ti=” + i + “\tn=” + n
- + ”\tStaticTest”);
- ++i;
- ++n;
- }// 9
- public static void main(String[] args) {
- new StaticTest(“init”);
- }
- }
public class StaticTest {
public static int k = 0;// 1
public static StaticTest s1 = new StaticTest("s1");// 2
public static StaticTest s2 = new StaticTest("s2");// 3
public static int i = print("i");// 4
public static int n = 99;// 5
public int j = print("j");// 6
{
print("构造块");
}// 7
static {
print("静态块");
}// 8
public static int print(String s) {
System.out.println(++k + ":" + s + "\ti=" + i + "\tn=" + n + "\tprint");
++n;
return ++i;
}
public StaticTest(String s) {
System.out.println(++k + ":" + s + "\ti=" + i + "\tn=" + n
+ "\tStaticTest");
++i;
++n;
}// 9
public static void main(String[] args) {
new StaticTest("init");
}
}
三、执行结果
这里不废话,直接上结果(大家都可以去试一下,这里我加上了sysoN====,一会分析时候用来对看),这一部分内容在下载的代码里也有。结果如下:
- /**
- *
- * 输出结果:
- *
- * syso1 ====”1:j i=0 n=0 print”
- *
- * syso2 ====”2:构造块 i=1 n=1 print”
- *
- * syso3 ====”3:s1 i=2 n=2 StaticTest”
- *
- * syso4 ====”4:j i=3 n=3 print”
- *
- * syso5 ====”5:构造块 i=4 n=4 print”
- *
- * syso6 ====”6:s2 i=5 n=5 StaticTest”
- *
- * syso7 ====”7:i i=6 n=6 print”
- *
- * syso8 ====”8:静态块 i=7 n=99 <span style=”white-space:pre”> </span>print”
- *
- * syso9 ====”9:j i=8 n=100 <span style=”white-space:pre”> </span>print”
- *
- * syso10====”10:构造块 <span style=”white-space:pre”> </span>i=9 n=101 <span style=”white-space:pre”> </span>print”
- *
- * syso11====”11:init <span style=”white-space:pre”> </span>i=10 <span style=”white-space:pre”> </span>n=102 <span style=”white-space:pre”> </span>StaticTest”
- */
/**
*
* 输出结果:
*
* syso1 ===="1:j i=0 n=0 print"
*
* syso2 ===="2:构造块 i=1 n=1 print"
*
* syso3 ===="3:s1 i=2 n=2 StaticTest"
*
* syso4 ===="4:j i=3 n=3 print"
*
* syso5 ===="5:构造块 i=4 n=4 print"
*
* syso6 ===="6:s2 i=5 n=5 StaticTest"
*
* syso7 ===="7:i i=6 n=6 print"
*
* syso8 ===="8:静态块 i=7 n=99 <span style="white-space:pre"> </span>print"
*
* syso9 ===="9:j i=8 n=100 <span style="white-space:pre"> </span>print"
*
* syso10===="10:构造块 <span style="white-space:pre"> </span>i=9 n=101 <span style="white-space:pre"> </span>print"
*
* syso11===="11:init <span style="white-space:pre"> </span>i=10 <span style="white-space:pre"> </span>n=102 <span style="white-space:pre"> </span>StaticTest"
*/
四、分析
一步一步按照上面的原则来分析,应该比较详细了,这一部分内容在下载的代码里也有。分析如下:
/**
* ====step1====首先声明StaticTest类的static变量并给与默认值。
*
* 故,执行1、2、3、4、5变量的声明。运行后变量如下:
*
* k=0; s1=null; s2=null; i=0; n=0; j未声明;
*
* ====step1 end====
*/
/**
* ====step2====变量声明完成后,为这些static变量赋值以及执行static块(赋值和块优先级一致,在前面的先执行).
*
* 故,执行1、2、3、4、5的赋值代码,8的块代码
*
* ========step2_1====当step2执行到2时,new了一个新的StaticTest对象.
* (此时2、3、4、5的赋值、8的代码都没执行,变量k被赋值为0,其余仍与step1中一致 )
* 这时,static变量已经声明(static变量是类属性,与对象无关),所以这里直接声明非static变量并给与默认值。
*
* 故,执行6变量的声明,运行后变量如下:
*
* k=0; s1=null; s2=null; i=0; n=0; j=0(s1的);
*
* ========step2_2====变量声明完成后,为这些非static变量赋值以及执行非static块。
*
* 故,执行6变量的赋值代码(syso1====k、n、i、j均+1),7的块代码(syso2====k、n、i均+1),运行后变量如下:
*
* k=2; s1=null; s2=null; i=2; n=2; j=1(s1的);
*
* ========step2_3====变量赋值、块执行完毕后,执行构造方法。
*
* 故,执行9构造方法(syso3====k、n、i均+1),运行后变量如下:
*
* k=3; s1=StaticTest对象; s2=null; i=3; n=3; j=1(s1的);
*
* ========step2_4====s1构造完毕后,继续执行3。同样是new一个新的StaticTest对象.
* 过程与step2_1至step2_3一致。
*
* 故,执行3(syso4====k、n、i、j(j=0)均+1;syso5====k、n、i均+1;syso6====k、n、i均+1),
* 运行后变量如下:
*
* k=6; s1=StaticTest对象; s2=StaticTest对象; i=6; n=6; j=1(s2的);
*
* ========step2_5====s2构造完毕后,继续执行4、5的赋值,为i和n赋值.
*
* 故,执行4(syso7====k、n、i均+1,i被重新赋值)、5(n被重新赋值)的赋值代码,运行后变量如下:
*
* k=7; s1=StaticTest对象; s2=StaticTest对象; i=7; n=99; j未声明;
*
* ========step2_6====static变量赋值完毕后,执行8的static块。
*
* 故,执行8(syso8====k、n、i均+1),运行后变量如下:
*
* k=8; s1=StaticTest对象; s2=StaticTest对象; i=8; n=100; j未声明;
*
* ====step2 end====
*/
/**
* ====step3====static变量及块完成后,声明非static变量并给与默认值.
*
* 故,执行6变量的声明。运行后变量如下:
*
* k=8; s1=StaticTest对象; s2=StaticTest对象; i=8; n=100; j=0(main的);
*
* ====step3 end====
*/
/**
* ====step4====非static变量声明完成后,为这些变量赋值以及执行非static块(赋值和块优先级一致,在前面的先执行)。
*
* 故,执行6的赋值代码(syso9====k、n、i均+1,j=++i),7的块代码(syso10====k、n、i均+1)。运行后变量如下 :
*
* k=10; s1=StaticTest对象; s2=StaticTest对象; i=10; n=102; j=9(main的);
*
* ====step4 end====
*/
/**
* ====step5====变量赋值、块执行完毕后,执行构造方法。
*
* 故,执行9构造方法(syso11====k、n、i均+1),运行后变量如下:
*
* k=11; s1=StaticTest对象; s2=StaticTest对象; i=11; n=103; j=9(main的);
*
* ====step5 end====
*/
五、执行流程图
以实例为准,绘制的图(原创图,请勿转载)。
一、总体原则
列出执行顺序的原则(这里本人出了简化,比较明了。可能有漏的,请帮忙补充,但应付该实例足以):
==父类先于子类;
==静态先于非静态;
==变量和块先于构造方法;
==变量声明先于执行(变量赋值、块执行);(这一点是根据数据在内存中是如何存储的得出的,基本类型、对象、String均不一样,但是总结起来应该是这样)
==变量赋值与块优先级相同;
==同优先级的从上至下执行;
二、实例
直接上题(小马哥的阿里,问:system.out打印结果。这里我加上了行号,方便解说):
- public class StaticTest {
- public static int k = 0;// 1
- public static StaticTest s1 = new StaticTest(“s1”);// 2
- public static StaticTest s2 = new StaticTest(“s2”);// 3
- public static int i = print(“i”);// 4
- public static int n = 99;// 5
- public int j = print(“j”);// 6
- {
- print(”构造块”);
- }// 7
- static {
- print(”静态块”);
- }// 8
- public static int print(String s) {
- System.out.println(++k + ”:” + s + “\ti=” + i + “\tn=” + n + “\tprint”);
- ++n;
- return ++i;
- }
- public StaticTest(String s) {
- System.out.println(++k + ”:” + s + “\ti=” + i + “\tn=” + n
- + ”\tStaticTest”);
- ++i;
- ++n;
- }// 9
- public static void main(String[] args) {
- new StaticTest(“init”);
- }
- }
public class StaticTest {
public static int k = 0;// 1
public static StaticTest s1 = new StaticTest("s1");// 2
public static StaticTest s2 = new StaticTest("s2");// 3
public static int i = print("i");// 4
public static int n = 99;// 5
public int j = print("j");// 6
{
print("构造块");
}// 7
static {
print("静态块");
}// 8
public static int print(String s) {
System.out.println(++k + ":" + s + "\ti=" + i + "\tn=" + n + "\tprint");
++n;
return ++i;
}
public StaticTest(String s) {
System.out.println(++k + ":" + s + "\ti=" + i + "\tn=" + n
+ "\tStaticTest");
++i;
++n;
}// 9
public static void main(String[] args) {
new StaticTest("init");
}
}
三、执行结果
这里不废话,直接上结果(大家都可以去试一下,这里我加上了sysoN====,一会分析时候用来对看),这一部分内容在下载的代码里也有。结果如下:
- /**
- *
- * 输出结果:
- *
- * syso1 ====”1:j i=0 n=0 print”
- *
- * syso2 ====”2:构造块 i=1 n=1 print”
- *
- * syso3 ====”3:s1 i=2 n=2 StaticTest”
- *
- * syso4 ====”4:j i=3 n=3 print”
- *
- * syso5 ====”5:构造块 i=4 n=4 print”
- *
- * syso6 ====”6:s2 i=5 n=5 StaticTest”
- *
- * syso7 ====”7:i i=6 n=6 print”
- *
- * syso8 ====”8:静态块 i=7 n=99 <span style=”white-space:pre”> </span>print”
- *
- * syso9 ====”9:j i=8 n=100 <span style=”white-space:pre”> </span>print”
- *
- * syso10====”10:构造块 <span style=”white-space:pre”> </span>i=9 n=101 <span style=”white-space:pre”> </span>print”
- *
- * syso11====”11:init <span style=”white-space:pre”> </span>i=10 <span style=”white-space:pre”> </span>n=102 <span style=”white-space:pre”> </span>StaticTest”
- */
/**
*
* 输出结果:
*
* syso1 ===="1:j i=0 n=0 print"
*
* syso2 ===="2:构造块 i=1 n=1 print"
*
* syso3 ===="3:s1 i=2 n=2 StaticTest"
*
* syso4 ===="4:j i=3 n=3 print"
*
* syso5 ===="5:构造块 i=4 n=4 print"
*
* syso6 ===="6:s2 i=5 n=5 StaticTest"
*
* syso7 ===="7:i i=6 n=6 print"
*
* syso8 ===="8:静态块 i=7 n=99 <span style="white-space:pre"> </span>print"
*
* syso9 ===="9:j i=8 n=100 <span style="white-space:pre"> </span>print"
*
* syso10===="10:构造块 <span style="white-space:pre"> </span>i=9 n=101 <span style="white-space:pre"> </span>print"
*
* syso11===="11:init <span style="white-space:pre"> </span>i=10 <span style="white-space:pre"> </span>n=102 <span style="white-space:pre"> </span>StaticTest"
*/
四、分析
一步一步按照上面的原则来分析,应该比较详细了,这一部分内容在下载的代码里也有。分析如下:
/**
* ====step1====首先声明StaticTest类的static变量并给与默认值。
*
* 故,执行1、2、3、4、5变量的声明。运行后变量如下:
*
* k=0; s1=null; s2=null; i=0; n=0; j未声明;
*
* ====step1 end====
*/
/**
* ====step2====变量声明完成后,为这些static变量赋值以及执行static块(赋值和块优先级一致,在前面的先执行).
*
* 故,执行1、2、3、4、5的赋值代码,8的块代码
*
* ========step2_1====当step2执行到2时,new了一个新的StaticTest对象.
* (此时2、3、4、5的赋值、8的代码都没执行,变量k被赋值为0,其余仍与step1中一致 )
* 这时,static变量已经声明(static变量是类属性,与对象无关),所以这里直接声明非static变量并给与默认值。
*
* 故,执行6变量的声明,运行后变量如下:
*
* k=0; s1=null; s2=null; i=0; n=0; j=0(s1的);
*
* ========step2_2====变量声明完成后,为这些非static变量赋值以及执行非static块。
*
* 故,执行6变量的赋值代码(syso1====k、n、i、j均+1),7的块代码(syso2====k、n、i均+1),运行后变量如下:
*
* k=2; s1=null; s2=null; i=2; n=2; j=1(s1的);
*
* ========step2_3====变量赋值、块执行完毕后,执行构造方法。
*
* 故,执行9构造方法(syso3====k、n、i均+1),运行后变量如下:
*
* k=3; s1=StaticTest对象; s2=null; i=3; n=3; j=1(s1的);
*
* ========step2_4====s1构造完毕后,继续执行3。同样是new一个新的StaticTest对象.
* 过程与step2_1至step2_3一致。
*
* 故,执行3(syso4====k、n、i、j(j=0)均+1;syso5====k、n、i均+1;syso6====k、n、i均+1),
* 运行后变量如下:
*
* k=6; s1=StaticTest对象; s2=StaticTest对象; i=6; n=6; j=1(s2的);
*
* ========step2_5====s2构造完毕后,继续执行4、5的赋值,为i和n赋值.
*
* 故,执行4(syso7====k、n、i均+1,i被重新赋值)、5(n被重新赋值)的赋值代码,运行后变量如下:
*
* k=7; s1=StaticTest对象; s2=StaticTest对象; i=7; n=99; j未声明;
*
* ========step2_6====static变量赋值完毕后,执行8的static块。
*
* 故,执行8(syso8====k、n、i均+1),运行后变量如下:
*
* k=8; s1=StaticTest对象; s2=StaticTest对象; i=8; n=100; j未声明;
*
* ====step2 end====
*/
/**
* ====step3====static变量及块完成后,声明非static变量并给与默认值.
*
* 故,执行6变量的声明。运行后变量如下:
*
* k=8; s1=StaticTest对象; s2=StaticTest对象; i=8; n=100; j=0(main的);
*
* ====step3 end====
*/
/**
* ====step4====非static变量声明完成后,为这些变量赋值以及执行非static块(赋值和块优先级一致,在前面的先执行)。
*
* 故,执行6的赋值代码(syso9====k、n、i均+1,j=++i),7的块代码(syso10====k、n、i均+1)。运行后变量如下 :
*
* k=10; s1=StaticTest对象; s2=StaticTest对象; i=10; n=102; j=9(main的);
*
* ====step4 end====
*/
/**
* ====step5====变量赋值、块执行完毕后,执行构造方法。
*
* 故,执行9构造方法(syso11====k、n、i均+1),运行后变量如下:
*
* k=11; s1=StaticTest对象; s2=StaticTest对象; i=11; n=103; j=9(main的);
*
* ====step5 end====
*/
五、执行流程图
以实例为准,绘制的图(原创图,请勿转载)。