java知识点:java代码块执行顺序总结

java代码块

代码块分为静态代码块和普通代码块,接下来将从以下几个方面了解两种代码块:

  1. 同一个类中,该类无继承类(除开Object类),静态代码块和普通代码块以及本类构造函数的执行顺序

    • 静态代码块比普通代码块先执行

    • public class CodeBlockDemo04 {
          public static void main(String[] args) {
              C c = new C();
          }
      }
      ​
      class C {
          public C() {
              System.out.println("构造函数");
          }
          
          // 普通代码块
          {
              System.out.println("普通代码块");
          }
      ​
          // 静态代码块
          static {
              System.out.println("静态代码块");
          }
      }
      /*
      静态代码块
      普通代码块
      构造函数
      */
  2. 同一个类中,该类除Object类外还有其他继承父类,静态代码块、super()、普通代码块三者的执行顺序

    • 执行顺序:子类静态代码块,super(), 普通代码块

    • public class CodeBlockDemo05 {
          public static void main(String[] args) {
              D c = new D();
          }
      }
      ​
      class D extends D1{
          public D() {
              // super() //隐式传递
              System.out.println("构造函数");
          }
      ​
          // 普通代码块
          {
              System.out.println("普通代码块");
          }
      ​
          // 静态代码块
          static {
              System.out.println("静态代码块");
          }
      }
      ​
      class D1 {
          public D1() {
              System.out.println("spuer()");
          }
      }
      ​
      /*
      静态代码块
      spuer()
      普通代码块
      构造函数
      */
  3. 同一个类中,有多个静态代码块和多个普通代码块的执行顺序

    • 同一个类中,所有静态代码块都优于所有普通代码块先执行,同类代码块之间的执行顺序与定义顺序一致

    • public class CodeBlockDemo06 {
          public static void main(String[] args) {
              E e = new E();
          }
      }
      ​
      class E {
          {
              System.out.println("普通代码块1");
          }
      ​
          {
              System.out.println("普通代码块2");
          }
      ​
          {
              System.out.println("普通代码块3");
          }
      ​
          static {
              System.out.println("静态代码块1");
          }
      ​
          static {
              System.out.println("静态代码块2");
          }
      ​
          static {
              System.out.println("静态代码块3");
          }
      ​
          public E() {
              System.out.println("构造函数");
          }
      }
      ​
      /*
      静态代码块1
      静态代码块2
      静态代码块3
      普通代码块1
      普通代码块2
      普通代码块3
      构造函数
      */
  4. 子类和父类中,分别有静态代码块,普通代码块,它们的执行顺序

    • 子类和父类,同类代码块始终是父类先执行,对于静态代码块,子类静态代码块比父类静态代码块后执行,比父类其他任意代码块先执行,其他代码块和构造函数就是按照子类父类加载顺序执行的

    • public class CodeBlockDemo07 {
          public static void main(String[] args) {
              F e = new F();
          }
      }
      ​
      class F extends F1 {
      ​
          {
              System.out.println("子类普通代码块");
          }
      ​
          static {
              System.out.println("子类静态代码块");
          }
      ​
          public F() {
              System.out.println("子类构造函数");
          }
      }
      ​
      class F1 {
      ​
          {
              System.out.println("父类普通代码块");
          }
      ​
          static {
              System.out.println("父类静态代码块");
          }
      ​
          public F1() {
              System.out.println("父类构造函数");
          }
      }
      ​
      /*
      父类静态代码块
      子类静态代码块
      父类普通代码块
      父类构造函数
      子类普通代码块
      子类构造函数
      */
  5. 一个类被多次new对象,静态代码块和普通代码块分别执行多少次

    • 一个类被多次实例化,静态代码块只执行一次,因为静态代码块随类对象一起加载,而一个类在方法区只有一个类对象,不管该类被实例化多少次;而普通代码块和构造器的执行次数一致

    • public class CodeBlockDemo08 {
          public static void main(String[] args) {
              G e = new G();
              G e1 = new G();
              G e2 = new G();
          }
      }
      ​
      class G {
      ​
          {
              System.out.println("普通代码块");
          }
      ​
          static {
              System.out.println("静态代码块");
          }
      ​
          public G() {
              System.out.println("构造函数");
          }
      }
      ​
      /*
      静态代码块
      普通代码块
      构造函数
      普通代码块
      构造函数
      普通代码块
      构造函数
      */
  6. 静态代码块可以调用的类中的变量,普通代码块可以调用的类中的变量

    • 静态代码块可以调用的方法和变量与静态方法调用原则一致,普通代码块与普通方法调用原则一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值