只要按照这个步骤,遇到这一类问题就可以解决了。
1.类中所有属性的默认值(一举而成)
2. 父类静态属性初始化,静态块,静态方法的声明(按出现顺序执行)
3. 子类静态属性初始化,静态块,静态方法的声明 (按出现顺序执行)
4. 调用父类的构造方法,
首先父类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)
然后父类构造方法
5. 调用子类的构造方法,
首先子类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)
然后子类构造方法
说明: 1-3:类加载过程,不涉及构造方法
1-5: 实例化过程,涉及构造方法
参考问题:执行下列代码,输出是什么?
class A {
public A() {
System.out.println("A的构造方法");
}
public static int j = print();
public static int print() {
System.out.println("A print");
return 521;
}
}
public class Test1 extends A {
public Test1() {
System.out.println("Test1的构造方法");
}
public static int k = print();
public static int print() {
System.out.println("Test print");
return 522;
}
public static void main(String[] args) {
System.out.println("main start");
Test1 t1 = new Test1();
}
}
看看是不是这个?如果是那么执行顺序掌握的不错。
A print
Test print
main start
A的构造方法
Test1的构造方法
再来个上题加强版:问输出顺序是什么?
public class Test1 extends A {
public Test1() {
System.out.println("Test1的构造方法");
}
public static int k = print();
{
System.out.println(k);
}
public static int print() {
System.out.println("Test print");
return 522;
}
public static void main(String[] args) {
System.out.println("main start");
Test1 t1 = new Test1();
Test1 t3;
Test1 t2 = new Test1();
}
}
class A {
public A() {
System.out.println("A的构造方法");
}
{
System.out.println(j);
}
public static int j = print();
static {
System.out.println(j);
}
public static int print() {
System.out.println("A print");
return 521;
}
static{
System.out.println("A的static block");
}
}
看看输出是不是:
A print
521
A的static block
Test print
main start
521
A的构造方法
522
Test1的构造方法
521
A的构造方法
522
Test1的构造方法
重复输出的部分:
521
A的构造方法
522
Test1的构造方法
来自于第二次new过程中:运行父类构造体与构造方法->子类构造体与构造方法
而且也可以看出 类的申明不会调用类的构造体