类的初始化和代码的执行顺序
package com.siyu.model.others;
/**
* 类的初始化
*
* 1-静态代码块和静态类变量初始化顺序,谁在上面,谁先执行,只执行一次。
* 2-非静态成员变量和非静态代码块谁在上谁先执行,并且每实例化一次,就执行一次;构造器最后执行,
* 3-在子类的构造器,一定会调用父类的构造器,有时候省略不写,默认有一个super。子类的初始化会调用父类初始化
*
*/
public class Father {
private int i = test();
private static int j = method();
static {
System.out.println("(1) 父类静态代码块");
}
public Father() {
System.out.println("(2) 我是父类构造方法");
}
{
System.out.println("(3) 父类非静态代码块");
}
public int test() {
System.out.println("(4) 父类成员方法");
return 1;
}
public static int method() {
System.out.println("(5) 父类静态方法");
return 1;
}
}
class Son extends Father {
private int i = test();
private static int j = method();
static {
System.out.println("(6) 子类静态代码块");
}
public Son() {
System.out.println("(7) 子类构造方法");
}
{
System.out.println("(8) 子类非静态代码块");
}
public int test() {
System.out.println("(9) 子类成员方法");
return 1;
}
public static int method() {
System.out.println("(10) 子类静态方法");
return 1;
}
/**
* (5) 父类静态方法
* (1) 父类静态代码块
* (10) 子类静态方法
* (6) 子类静态代码块
* (9) 子类成员方法
* (3) 父类非静态代码块
* (2) 我是父类构造方法
* (9) 子类成员方法
* (8) 子类非静态代码块
* (7) 子类构造方法
*
* (9) 子类成员方法
* (3) 父类非静态代码块
* (2) 我是父类构造方法
* (9) 子类成员方法
* (8) 子类非静态代码块
* (7) 子类构造方法
* @param args
*/
public static void main(String[] args) {
Son s1 = new Son();
/*
首先初始化类,然后再初始化对象
开始初始化类了
先初始化父类
类变量和静态代码块初始化的顺序是:谁在上,先初始化谁。所以在本题中,先初始化类变量,执行method(),然后静态代码块,所以打印(5)(1)
然后初始化子类,打印(10) (6)
至此,类初始化完成,接下来开始初始化对象了。
初始化子类对象第一步是先初始化父类,因为子类要继承父类东西
初始化父类,非静态成员变量和非静态代码块的顺序是,谁在上,先初始化谁,构造器最后,所以父类初始化的顺序是:(9)(3)(2)
不应该是(4)(3)(2)吗?不是,因为test()方法是子类重写,一个方法父子类都有,子类初始化,所以执行的是子类的test()
然后初始化子类
子类是:(9)(8)(7)
*/
System.out.println();
// 后面又实例化一个新对象,那就再初始化一边。
Son s2 = new Son();
}
}
我对任何唾手而得,快速,出自本能,即兴,含混的事物没有信心。我相信缓慢,平和,细水长流的力量,踏实,冷静。我不相信缺乏自律精神和不自我建设,不努力,可以得到个人或集体的解放。