1. java中静态代码块,实例代码块,构造器优先执行顺序
1.1 案例一
package cn.tedu.oop;
class ClassCC{
static ClassCC instance = new ClassCC();//属于静态成员
static {//属于静态成员,静态代码块在类加载时可以初始化,假如有多个静态成员,则会按照编写的顺序执行
System.out.println("static{}");
}
{//实例代码块(每次构建对象都会执行)
//实例代码块,每次生成类实例都会执行,并且,实例代码块的执行优先于构造器
System.out.println("{}");
}
public ClassCC(){//构造器
System.out.println("ClassCC");
}
}
public class TestClassObject08 {
public static void main(String[] args) {
ClassCC c1=ClassCC.instance;
ClassCC c2 = new ClassCC();
}
}
执行结果:
1.2 案例二
package cn.tedu.oop;
class ClassCC{
static ClassCC instance = new ClassCC();//属于静态成员
static {//属于静态成员,静态代码块在类加载时可以初始化,假如有多个静态成员,则会按照编写的顺序执行
System.out.println("静态代码块");
}
{//实例代码块(每次构建对象都会执行)
//实例代码块,每次生成类实例都会执行,并且,实例代码块的执行优先于构造器
System.out.println("实例代码块");
}
public ClassCC(){
System.out.println("构造方法");
}
public ClassCC(String g){
System.out.println("构造方法c2");
}
}
public class TestClassObject08 {
public static void main(String[] args) {
ClassCC c2 = new ClassCC("g");
System.out.println(c2);
ClassCC c1=ClassCC.instance;
System.out.println(c1);
}
}
结果:
1.3 总结:
- 实例代码块,每次构建对象都会执行,并且,实例代码块的执行优先于构造器
- 多个静态成员,会按照编写的顺序执行,谁靠前先执行谁
- 多个静态成员执行优先于main方法
1.4 为什么实例代码块的执行优先于构造器?
查看反编译文件:
.class文件
不难发现,代码块实际上是被放到了构造方法中,且是放在了构造方法的第一句,由此看出实例代码块的执行优先于构造器
2.新建对象时属性的四个过程:
来自博客:https://blog.csdn.net/sunforraining/article/details/79008171
public class Test1 {
public static void main(String[] args) {
Student stu = new Student("zhangan", 21);
}
}
class Student {
public String name = "李寻欢";
public int age = 20;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
2.
3.
4.
2.1分析:
1.dubug调试开始
创建对象,调用构造方法之前对象成员作初始化操作(对象成员name=null,age=0)
2.调用构造方法,首先非静态成员初始化,构造块,普通方法的声明(按出现顺序执行),然后构造方法