1. 类中代码的执行顺序
- 静态代码一定是先于main方法的。
- 先执行静态代码块(静态代码是属于这个类的)。
- 类中定义静态成员变量对象,它和静态代码块属于一个级别,也就是说这两者谁写在前面,谁就先执行。
- 如果是非静态代码块和非静态成员变量,不执行,只有当创建这个类的具体对象实例时,才会执行非静态代码块和非静态成员变量。
- 如果同时存在非静态代码块和静态代码块,静态代码块和静态成员变量先执行,并且只执行一次,因为这是一个类加载到JVM的过程,静态部分是属于类的,当类加载完毕,静态部分也就不会在后面实例化对象的时候执行了。创建对象时,才执行非静态部分,并且创建多少个对象就执行多少次。
2. 当存在父子类时
Child extends Parent
Child child= new Child();
- 先加载Parent,执行Parent类的静态代码。
- 加载Child,执行Child的静态代码。
- 类加载完之后,创建对象,先创建 Parent对象,创建对象前,先创建对象的资源(代码中非静态的部分,在main方法之外)。
- 执行Parent构造器,完成对象创建。
- 创建 Child对象之前,先创建对象的资源
执行Child对象的构造器方法,完成对象创建。
场景一:求b的值
public class OrderDemo {
private static int b=0;
static {
b=1;
}
public static void main(String[] args) {
System.out.println(b);
//b=1
}
}
场景二:求b的值
public class OrderDemo {
static {
b=1;
}
private static int b=0;
public static void main(String[] args) {
System.out.println(b);
//b=0
}
}
场景三:求a的值
public class OrderDemo {
private int a=0;
{
a=1;
}
public static void main(String[] args) {
System.out.println(new OrderDemo().a);
//a=1
}
}
场景四:求a的值
public class OrderDemo {
{
a=1;
}
private int a=0;
public static void main(String[] args) {
System.out.println(new OrderDemo().a);
//a=0
}
}
场景五:求a的值
public class OrderDemo {
public OrderDemo() {
a = 10;
}
{
a=1;
}
private int a=0;
public static void main(String[] args) {
System.out.println(new OrderDemo().a);
//a=10
}
}
总结
- 成员变量赋值和代码块赋值,按顺序执行,写在后面的会覆盖前面的。
- 静态变量赋值和静态代码块赋值,同上逻辑。
- 构造器最后一个执行。