1. 类中代码的执行顺序

  1. 静态代码一定是先于main方法的。
  2. 先执行静态代码块(静态代码是属于这个类的)。
  3. 类中定义静态成员变量对象,它和静态代码块属于一个级别,也就是说这两者谁写在前面,谁就先执行。
  4. 如果是非静态代码块和非静态成员变量,不执行,只有当创建这个类的具体对象实例时,才会执行非静态代码块和非静态成员变量。
  5. 如果同时存在非静态代码块和静态代码块,静态代码块和静态成员变量先执行,并且只执行一次,因为这是一个类加载到JVM的过程,静态部分是属于类的,当类加载完毕,静态部分也就不会在后面实例化对象的时候执行了。创建对象时,才执行非静态部分,并且创建多少个对象就执行多少次。

2. 当存在父子类时

  1. Child extends Parent
  2. Child child= new Child();
  1. 先加载Parent,执行Parent类的静态代码。
  2. 加载Child,执行Child的静态代码。
  3. 类加载完之后,创建对象,先创建 Parent对象,创建对象前,先创建对象的资源(代码中非静态的部分,在main方法之外)。
  4. 执行Parent构造器,完成对象创建。
  5. 创建 Child对象之前,先创建对象的资源
  6. 执行Child对象的构造器方法,完成对象创建。

  7. 场景一:求b的值

    1. public class OrderDemo {
    2. private static int b=0;
    3. static {
    4. b=1;
    5. }
    6. public static void main(String[] args) {
    7. System.out.println(b);
    8. //b=1
    9. }
    10. }
  8. 场景二:求b的值

    1. public class OrderDemo {
    2. static {
    3. b=1;
    4. }
    5. private static int b=0;
    6. public static void main(String[] args) {
    7. System.out.println(b);
    8. //b=0
    9. }
    10. }
  9. 场景三:求a的值

    1. public class OrderDemo {
    2. private int a=0;
    3. {
    4. a=1;
    5. }
    6. public static void main(String[] args) {
    7. System.out.println(new OrderDemo().a);
    8. //a=1
    9. }
    10. }
  10. 场景四:求a的值

    1. public class OrderDemo {
    2. {
    3. a=1;
    4. }
    5. private int a=0;
    6. public static void main(String[] args) {
    7. System.out.println(new OrderDemo().a);
    8. //a=0
    9. }
    10. }
  11. 场景五:求a的值

    1. public class OrderDemo {
    2. public OrderDemo() {
    3. a = 10;
    4. }
    5. {
    6. a=1;
    7. }
    8. private int a=0;
    9. public static void main(String[] args) {
    10. System.out.println(new OrderDemo().a);
    11. //a=10
    12. }
    13. }

    总结

  • 成员变量赋值和代码块赋值,按顺序执行,写在后面的会覆盖前面的。
  • 静态变量赋值和静态代码块赋值,同上逻辑。
  • 构造器最后一个执行。