首页 > 编程语言 >Java的初始化块

Java的初始化块

时间:2023-04-27 10:11:41浏览次数:37  
标签:初始化 Java 静态 构造 static private nextId

三种初始化数据域的方法:

  • 在构造器中设置值
  • 在声明中赋值
  • 初始化块(initialization block)

初始化块

在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。

class Employee {
    private static int nextId;
    private int id;
    private String name;
    private double salary;

    // object initialization block
    {
        id = nextId;
        nextId++;
    }
}

在上面这个示例中,无论使用哪个构造器构造对象,id 域都在对象初始化块中被初始化。首先运行初始化块,然后才运行构造器的主体部分。

初始化块这种机制不是必需的,也不常见。通常会直接将初始化代码放在构造器中。


由于初始化数据域有多种途径,所以列出构造过程的所有路径可能相当混乱。下面是调用构造器的具体处理步骤:

  1. 所有数据域被初始化为默认值(0、false 或 null)
  2. 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块
  3. 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体
  4. 执行这个构造器的主体

静态的初始化块

可以通过提供一个初始化值,或者使用一个静态的初始化块来对静态域进行初始化。

前面已经介绍过第一种机制(提供一个初始化值):private static int nextId = 1;

如果对类的静态域进行初始化的代码比较复杂,那么可以使用静态的初始化块。将代码放在一个块中,并标记关键字 static。下面是一个示例。其功能是将雇员 ID 的起始值赋予一个小于 10000 的随机整数。

// static initialization block
static {
	Random generator = new Random();
	nextId = generator.nextInt(lOOOO);
}

在类第一次加载的时候,将会进行静态域的初始化。与实例域一样,除非将它们显式地设置成其他值,否则默认的初始值是 0、false 或 null。所有的静态初始化语句以及静态初始化块都将依照类定义的顺序执行。

参考资料

《Java核心技术卷一:基础知识》(第10版)第 4 章:对象与类 4.6.7 初始化块

标签:初始化,Java,静态,构造,static,private,nextId
From: https://www.cnblogs.com/feiyu2/p/17358150.html

相关文章

  • java获取当前年份、月份和日期
    创建一个Calendar类的实例对象,Calendar类属于java.util包Calendarcalendar=Calendar.getInstance();获SimpleDateFormatformat=newSimpleDateFormat(“yyyy-MM-dd”);//获取当月第一天calendar=Calendar.getInstance();calendar.add(Calendar.MONTH,0);calendar......
  • JavaScript获取两个数组的差集
    constarra=['a','b','c','d','e'];constarrb=['b','e'];console.log("some:"+arra.filter(v=>!arrb.some((item)=>item===v)));console.log("find:&quo......
  • springboot入门时,发现Java版本与Spring boot版本无法对应导致错误的问题解决
    <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/......
  • Java自定义生成证书图片
    1、引入依赖<!--cmyk格式图片转换--><dependency><groupId>org.sejda.imageio</groupId><artifactId>webp-imageio</artifactId><version>0.1.6</version></dependen......
  • 基于Java开发支持全文检索、工作流审批、知识图谱的应用系统
    一、项目介绍一款全源码,可二开,可基于云部署、私有部署的企业级知识库云平台,应用在需要进行常用文档整理、分类、归集、检索的地方,适合知识密集型单位/历史文档丰富的单位,或者大型企业、集团。为什么建立知识库平台?二、项目所用技术springboot+vue+tinyMce+activiti+elastics......
  • 【单例设计模式原理详解】Java/JS/Go/Python/TS不同语言实现
    简介单例模式(SingletonPattern)属于创建型设计模式,这种模式只创建一个单一的类,保证一个类只有一个实例,并提供一个访问该实例的全局节点。当您想控制实例数目,节省系统资源,并不想混用的时候,可以使用单例模式。单例有很多种实现方式,主要分为懒汉和饿汉模式,同时要通过加锁来避免线程......
  • java解决表达式计算问题(转)
    这是LeetCode上的一道题,因为特别具有代表性,所有记录在这里。题目227.给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如eval()。......
  • Java8使用Stream API转换Map遇到的2种异常报错和解决思路
    问题java8提供了StreamAPI,配合Lambda表达式,让开发者能对集合对象进行便利、高效的操作。在日常业务开发中,有个经常用到的场景是将List类型对象转换为Map类型对象,方便后续操作。在java8之前,这种转换需要先new一个Map对象,遍历list然后通过Map#put来初始化。使用java8后,可方便的......
  • java出现class lombok.javac.apt.LombokProcessor错误
    出现:java:java.lang.IllegalAccessError:classlombok.javac.apt.LombokProcessor(inunnamedmodule@0x3278991b)cannotaccessclasscom.sun.tools.javac.processing.JavacProcessingEnvironment(inmodulejdk.compiler)becausemodulejdk.compilerdoesnotexpor......
  • Java对象内存布局
    一、对象在堆内存中布局Objectobject=newObject()一般而言JDK8按照默认情况下,new一个对象占多少内存空间在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(InstanceData)和对齐填充(Padding)。二、对象在堆内存中的存储布局下面......