1.类型一:
package com.dbzhang.order; public class A { public A() { System.out.println("A的构造函数4"); } { System.out.println("A的非静态初始化块3"); } static { System.out.println("A的静态初始化块1"); } /** * @param args */ /*public static void main(String[] args) { new A(); System.out.println("===================="); }*/ }
package com.dbzhang.order; public class B extends A{ public B() { System.out.println("B的构造函数6"); } { System.out.println("B的非静态初始化块5"); } static { System.out.println("B的静态初始化块2"); } /** * @param args */ public static void main(String[] args) { new B(); System.out.println("-----------------7"); } }
执行的结果:
A的静态初始化块1 B的静态初始化块2 A的非静态初始化块3 A的构造函数4 B的非静态初始化块5 B的构造函数6 -----------------7
汇总:
(1)静态块、非静态块、变量的执行顺序先于方法;
(2)静态块先于非静态块;
2.第二种方式:要结合上边A类的代码
package com.dbzhang.order; public class B extends A{ public B() { System.out.println("B的构造函数6"); } { System.out.println("B的非静态初始化块5"); } static { System.out.println("B的静态初始化块2"); } /** * @param args */ public static void main(String[] args) { new A(); System.out.println("-----------------7"); } }
执行结果:
A的静态初始化块1 B的静态初始化块2 A的非静态初始化块3 A的构造函数4 -----------------7
汇总:
(1)构造函数只有在new 对象的时候才能调用;
3.第三种方式:重写父类中的main()方法:
package com.dbzhang.order; public class A { public A() { System.out.println("A的构造函数4"); } { System.out.println("A的非静态初始化块3"); } static { System.out.println("A的静态初始化块1"); } /** * @param args */ public static void main(String[] args) { new A(); System.out.println("===================="); } }
package com.dbzhang.order; public class B extends A{ public B() { System.out.println("B的构造函数6"); } { System.out.println("B的非静态初始化块5"); } static { System.out.println("B的静态初始化块2"); } /** * @param args */ public static void main(String[] args) { new A(); System.out.println("-----------------7"); } }
执行结果:
A的静态初始化块1 B的静态初始化块2 A的非静态初始化块3 A的构造函数4 -----------------7
汇总:
(1)子类重写父类中的main方法,但是仍和上边的执行顺序一样;
二:关于赋值的问题:当一个int型变量经过如下赋值:显示初始化、静态初始化块、构造函数,最后去哪个值?
package com.dbzhang.order; public class A { static { a = 3; } private static int a = 1; public A() { a = 2; } /** * @param args */ public static void main(String[] args) { new A(); System.out.println("===================="+a); } }
输出结果:
当不new对象的时候
====================3
当new对象的时候是:
====================2
汇总:
(1)当new对象时才会调用构造函数;
(2)a的赋值经历过程:静态变量、在初始化块、构造函数