Java 中的代码块

1. 普通代码块

  • 说明:普通代码块在方法体中定义,也可以定义在构造代码块和静态代码块中。
  • 格式
    public class Demo {
    
        public static void main(String[] args) {
            {
                System.out.println("main 方法中的普通代码块1");
                {
                    System.out.println("main 方法中的普通代码块2");
                }
                {
                    System.out.println("main 方法中的普通代码块3");
                }
            }
        }
    }
    复制代码
  • 编译结果
    public class Demo {
    
        public static void main(String[] args) {
            {
                System.out.println("main 方法中的普通代码块1");
                {
                    System.out.println("main 方法中的普通代码块2");
                }
                {
                    System.out.println("main 方法中的普通代码块3");
                }
            }
        }
    }
    复制代码
    • 注:普通代码块编译后直接去掉了{}
  • 执行顺序:普通代码块的执行顺序按照书写顺序
  • 运行结果
    main 方法中的普通代码块1
    main 方法中的普通代码块2
    main 方法中的普通代码块3
    复制代码

2. 构造代码块

  • 说明:构造代码块指的是直接在Java类中使用{}声明的代码块,与静态代码块相比少了static 关键字。
  • 构造代码块的调用依赖对象的生成,但是执行顺序优先与构造方法。
  • 格式
    public class Demo {
    
        {
            System.out.println("执行构造代码块1");
        }
    
        public Demo() {
            System.out.println("无参构造器");
        }
    
        public Demo(int i) {
            System.out.println("有参构造器");
        }
    
        public static void main(String[] args) {
            System.out.println("执行 main 方法");
            new Demo();
        }
    
        {
            System.out.println("执行构造代码块2");
        }
    }
    复制代码
  • 编译结果
    public class Demo {
        public Demo() {
            System.out.println("执行构造代码块1");
            System.out.println("执行构造代码块2");
            System.out.println("无参构造器");
        }
    
        public Demo(int i) {
            System.out.println("执行构造代码块1");
            System.out.println("执行构造代码块2");
            System.out.println("有参构造器");
        }
    
        public static void main(String[] args) {
            System.out.println("执行 main 方法");
            new Demo();
        }
    }
    复制代码
  • 注:通过反编译结果可知,构造代码块在编译后直接插入到了对应类的构造方法最前端,顺序依据书写顺序,有多个构造方法即会插入多次。因为插入在最前端,所以优先于构造方法执行。
  • 执行顺序:对象实例化时,优于构造器执行。
  • 运行结果:
    执行 main 方法
    执行构造代码块1
    执行构造代码块2
    无参构造器
    复制代码

3. 静态代码块

  • 说明:静态代码块与构造代码块相同,都是写在Java类中,不能写在方法中。不同的是静态代码块需要用static关键字修饰。
  • 格式
    public class Demo {
    
       static  {
            System.out.println("静态代码块1");
        }
    
        public static void main(String[] args) {
            System.out.println("执行 main 方法");
        }
    
        static  {
            System.out.println("静态代码块2");
        }
    }
    
    复制代码
  • 编译结构
    public class Demo {
        public Demo() {
        }
    
        public static void main(String[] args) {
            System.out.println("执行 main 方法");
        }
    
        static {
            System.out.println("静态代码块1");
            System.out.println("静态代码块2");
        }
    }
    复制代码
  • 注:静态代码块编译后将多个静态代码块的内容整合成了一个静态代码块,顺序按照书写顺序。
  • 执行顺序:类加载时执行一次。
  • 运行结果
静态代码块1
静态代码块2
执行 main 方法
复制代码

4. 继承结构下的代码块

  • 在继承结构中,代码的加载顺序会先加载父类,然后加载子类。
  • 实例化时,也会先实例化父类,然后是子类。

5. 总结

  • 执行顺序
    • 非继承结构:静态代码块 > 构造代码块 > 构造方法 > 普通代码块 
    • 继承结构:父类静态代码块 > 子类静态代码块 > 父类构造代码块 > 父类构造方法 > 子类构造代码块 > 子类构造方法 > 普通代码块
一家之言,姑妄视之。才疏学浅,还望斧正。
复制代码

猜你喜欢

转载自juejin.im/post/5cbd5ed1f265da035a1f1cc3