局部代码块
静态代码块
构造代码块
默认初始化、显式赋值
构造器、this构造器
总结:
new过程当中,【构造代码块,显式赋值,构造器】的执行顺序:
1,如果构造器的第一行使用了this调用了别的构造器,那么程序会先跳到this构造器,
但是不会执行this构造器代码 8、9、10
2,接下来:
先默认初始化所有的成员变量 11
接下来按照上下的顺序执行显式赋值和构造代码块 12、13
接下来再执行this构造器 14
最后执行那个被调用的构造器 15
public class ExerciseBlock {
//1,类加载静态代码块执行了,所以这里最先输出
static {
System.out.println("main方法静态代码块!");
}
{
System.out.println("main方法构造代码块!");
}
//main方法会触发这个类的类加载
public static void main(String[] args) {
//2,类加载完毕后,输出这里
System.out.println("main方法开始执行!");
//3,这里创建类Star对象,立刻马上找个这个构造方法
Star s = new Star(18,"马化腾");
//16,构造器已经调用结束了,于是开始执行后面的代码
System.out.println(Star.name);
System.out.println(s.age);
}
}
class Star{
//12,执行构造代码块,打印name=杨超越
{
age = 18;
Star.name = "杨超越";
System.out.println("我喜欢杨超越");
}
//5,初始化静态成员name,null--->王菲
static String name = "王菲";
//11,默认初始化成员变量 age = 0
//13,给age赋值 age = 28;
int age = 28;
//6,执行静态代码块,name=杨幂,打印我喜欢杨幂
static {
name = "杨幂";
System.out.println("我喜欢杨幂");
}
//4,找到了这个构造方法,然后它不会执行,因为要类加载
//7,现在类加载结束了,开始创建对象
public Star(int age,String name) {
//8,它一看这里有个this调用别的构造方法,于是它去找this构造器
this(age);
//15,this构造器执行完毕,开始执行创建对象的那个构造器
//打印了age,name构造器
System.out.println("age,name:构造器!");
//给name赋值 name = 马化腾
Star.name = name;
//又给name赋值 = 刘亦菲
Star.name = "刘亦菲";
}
//9,找个这个构造器
public Star(int age) {
//10,不是立刻执行该构造器,而是初始化普通的成员变量,执行构造代码块
//14,普通的成员变量已经初始化完毕,开始执行this构造器
//打印age 构造器
//并且给age 赋值 age = 18
System.out.println("age:构造器!");
this.age = age;
}
public Star() {
}
}