zoukankan      html  css  js  c++  java
  • java构造代码块详解

    一.简介

    首先说一下,Java中有哪些代码块.

    普通代码块

    就是在方法后面使用"{}"括起来的代码片段,不能单独执行,必须调下其方法名才可以执行.

    静态代码块

    在类中使用static修饰,并使用"{}"括起来的代码片段,用于静态变量的初始化或对象创建前的环境初始化.

    同步代码块

    使用synchronize关键字修饰,并使用"{}"括起来的代码片段.它表示在同一时间只能有一个线程进入到该方法快中,是一种多线程保护机制.

    构造代码块

    在类中没与任何的前缀或后缀,并使用"{}"括起来的代码片段.

    简单的例子:

    public class Client {
        {//构造代码块
            System.out.println("执行构造代码块");
        }
    
        public Client() {
            System.out.println("执行无参构造函数");
        }
    
        public Client(String string) {
            System.out.println("执行有参构造函数");
        }
    }

    这是一丢按非常简单的代码,它包含了构造代码块,无参构造,有参构造.我先看一个问题,我们知道代码块不具有独立执行的能力,那么编译器是如何处理构造代码块的呢?很简单,编译器会把构造代码块插入到每个构造函数的最前端.这样 上面的代码就等同于:

    public class Client {
    
        public Client() {
            System.out.println("执行构造代码块");
            System.out.println("执行无参构造函数");
        }
    
        public Client(String string) {
            System.out.println("执行构造代码块");
            System.out.println("执行有参构造函数");
        }
    }
    

    二.特性与应用

    基本的理解后,我们再来看下其和构造函数的执行顺序.由于是插入到构造函数的的前面,自然在通过new关键字生成一个实例的时候会先执行构造代码块,然后在执行其他代码(注意:构造代码块不是在构造函数之前运行,而是依托于构造函数).接着我们来看一下两个主要的应用场景:

    1.初始化实例变量

    如果每个构造函数都需要初始化变量,即可通过构造代码块来实现.从而取代在每个构造函数调用初始化实例变量的方法.
    

    2.初始化实例环境 

    一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象的时候创建此场景.

    以上两个场景都是利用了构造代码块的两个特性:

    1.在每个构造函数中都运行
    2.在构造函数中它会首先运行1

    三.构造代码块足够聪明

    首先看一段代码,使用构造代码块做对象计数器.

    public class Client {
        public static int count = 0;
        {
            count++;
        }
    
        public Client() {
    
        }
    
        public Client(int i) {
            this();
        }
    
        public Client(String string) {
        }
    
        public static void main(String[] args) {
            new Client();
            new Client(1);
            new Client("1");
            System.out.println(Client.count);
        }
    }

    这个代码真的达到我们预期的效果吗?你可能会对this()产生了质疑. 

    答案是:

    显然Java编译器是足够聪明的.这是因为,在插入到每个构造函数中的时候,有个例外,就是如果遇到this关键字(也就是构造函数调用自身其他的构造函数时)不插入构造代码块.

    那为什么编译器这么聪明呢?这是因为构造代码块的出现就是为了提取构造函数的共同量,减少各个构造函数的代码而产生的.

    四.总结

    灵活适当的使用构造代码块会让你的代码更加的简约和清晰.代码的质量自然很高很多,逼格也高了许多,有没有.

    最后还有一点需要注意的,千万不要认为this是特殊情况,那super也会类似处理.其实不会,在构造代码块的处理上,super方法没有任何特殊的地方.编译器只是把构造代码块插入到super方法之后执行而已.

  • 相关阅读:
    storm中的Scheduler
    开启flume的远程调试功能
    修改flume源码,使其HTTPSource具备访问路径功能
    非功能测试——效率测试
    python100例
    awk命令
    shell正则表达式
    python的垃圾回收机制
    冯-诺伊曼体系结构
    jmeter读取文件内容做变量
  • 原文地址:https://www.cnblogs.com/sunyubin/p/9763050.html
Copyright © 2011-2022 走看看