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的赋值经历过程:静态变量、在初始化块、构造函数