当前位置: 首页 > news >正文

Java 初始化块

文章目录

    • 1、初识初始化块
    • 2、实例初始化块和构造器
    • 3、类初始化块

1、初识初始化块

Java 使用构造器来对单个对象进行初始化操作,使用构造器先完成对整个 Java 对象的状态初始化,然后将 Java 对象返回给程序,从而让该 Java 对象的信息更加完整。

与构造器作用非常类似的是初始化块,它也可以对 Java 对象进行初始化操作。

  • 初始化块定义的格式
[修饰符]{// 代码
}

代码

public class Demo02 {// 实例初始化块{System.out.println("实例初始化块执行了...");}// 类初始化块static {System.out.println("类初始化块执行了...");}// 构造器public Demo02() {System.out.println("无参构造器执行了...");}public static void main(String[] args) {new Demo02();System.out.println("------------------");new Demo02();}
}

结果

类初始化块执行了...
实例初始化块执行了...
无参构造器执行了...
------------------
实例初始化块执行了...
无参构造器执行了...

说明

  • 一个类里可以有多个初始化块,相同类型的初始化块之间有顺序:先定义的先执行,后定义的后执行。
  • 初始化块如果有修饰符的话,只能是 static。
  • 使用 static 修饰的初始化块称为类初始化块(静态初始化块)。
  • 没有 static 修饰的初始化块称为实例初始化块(非静态初始化块)
  • 初始化块里的代码可以包含任何可执行性语句,包括定义局部变量、调用其他对象的方法、以及使用分支、循环语句等。
  • 初始化块虽然是 Java 类的一种成员,但它没有名字、标识,因此无法通过类、对象来调用初始化块。
  • 实例初始化块只在创建 Java 对象时隐式执行,而且在构造器之前自动执行。
  • 类初始化块则在类初始化阶段自动执行。

注:

虽然一个类里允许定义 2 个实例初始化块,但这没有任何意义。

因为实例初始化块是在创建对象时隐式调用的,而且它们总是全部执行,因此完全可以把多个实例初始化块合并成一个实例初始化块,让程序简洁、可读性强。

2、实例初始化块和构造器

实例初始化块声明实例变量时指定的默认值都可认为是对象初始化代码,它们的执行顺序与源程序中的排列顺序相同。

public class Demo01 {// 声明实例变量的默认值在前public int a = 10;// 实例初始化块在后{a = 20;}public Demo01() {}public static void main(String[] args) {Demo01 demo01 = new Demo01();System.out.println(demo01.a); // 20 }
}
public class Demo01 {// 实例初始化块在前{a = 20;}// 声明实例变量的默认值在后public int a = 10;public Demo01() {}public static void main(String[] args) {Demo01 demo01 = new Demo01();System.out.println(demo01.a); // 10}
}

说明

当 java 创建一个对象时,系统先为该对象的所有实例变量分配内存(前提是该类已经被加载过了),接着程序开始对这些实例变量执行初始化

执行初始化的顺序是:先执行实例初始化块 或 声明实例变量时指定的默认值(执行顺序与它们在源码中的排列顺序相同),再执行构造器中指定的初始值。

与构造器不同的

实例初始化块是一段固定执行的代码,无法接收任何参数,因此实例初始块对一个类中的所有对象执行的初始化操作是相同的。

如何使用

如果有一段初始化处理代码中对所有对象完全相同,且无须接收任何参数,就可以把这段实例初始化代码提取到实例初始化块中。

对实例初始化块的分析

实力初始化块是一个假象,在编译之后的字节码文件中,实例初始化块会消失——实例初始化块会被 “还原” 到每个构造器中,且位于构造器所有代码的前面。

Demo02.java

public class Demo02 {// 实例初始化块{System.out.println("实例初始化块执行了...");}// 类初始化块static {System.out.println("类初始化块执行了...");}// 构造器public Demo02() {System.out.println("无参构造器执行了...");}public static void main(String[] args) {new Demo02();System.out.println("------------------");new Demo02();}
}

编译之后的字节码文件 Demo02.class

public class Demo02 {public Demo02() {System.out.println("实例初始化块执行了...");System.out.println("无参构造器执行了...");}public static void main(String[] args) {new Demo02();System.out.println("------------------");new Demo02();}static {System.out.println("类初始化块执行了...");}
}

与构造器类似,创建一个对象时,不仅会执行该类的实例初始化块构造器,而且系统会先执行其父类中的实例初始化块(如果有)和构造器,一直追溯到祖宗类 Object 类,先执行 Object 类的实例初始化块(如果有)、构造器,最后才执行该类的实例初始化块(如果有)和构造器,返回该类的对象。

代码

class Person {{System.out.println("Person-->实例初始化块");}public Person() {System.out.println("Person-->构造器");}
}class Student extends Person {{System.out.println("Student-->实例初始化块");}public Student() {System.out.println("Student-->构造器");}public static void main(String[] args) {new Student();}
}

结果

Person-->实例初始化块
Person-->构造器
Student-->实例初始化块
Student-->构造器

如果希望类加载后对整个类(类变量)进行某些初始化操作,就需要使用 static 关键字来修饰初始化块。

3、类初始化块

实例初始化块负责对对象执行初始化;类初始化块负责对类初始化。

系统在类初始化阶段执行类初始化块,而不是创建对象时执行,因此类初始化块总是比实例初始化块先执行。

当 JVM 第一次主动使用某个类时,系统会在类准备阶段为该类的所有类变量分配内存;在初始化阶段负责初始化类变量。

类初始化块声明类变量时指定的默认值都可认为是类初始化代码,它们的执行顺序与源程序中的排列顺序相同。

public class Demo01 {public static String name = "java";static {name = "JAVA";}public static void main(String[] args) {System.out.println(Demo01.name); // JAVA}
}
public class Demo01 {static {name = "JAVA";}public static String name = "java";public static void main(String[] args) {System.out.println(Demo01.name); // java}
}

注:

类初始化块(静态初始化块)属于类的静态成员,同样遵循静态成员不能访问非静态成员的规则

因此类初始化块不能访问非静态成员(实例变量、实例方法)

与实例初始化块类似的是,系统在类初始化阶段执行类初始化块时,不仅会执行本类的类初始化块,而且还会一直上溯到 Object 类的类初始化块(如果有),先执行 Object 的类初始化块(如果有),然后执行其父类的类初始化块 ……,最后在执行本类的类初始化块。

只有当类初始化完成之后,才可以在系统中使用这个类(类变量、类方法、创建对象)

Java 系统加载并初始化某个类时,总是保证该类的所有父类(直接父类或间接父类)全部加载并初始化。

Root

public class Root {static {System.out.println("Root-->静态初始化块");}{System.out.println("Root-->实例初始化块");}public Root() {System.out.println("Root-->无参构造器");}
}

Mid

public class Mid extends Root{static {System.out.println("Mid-->静态初始化块");}{System.out.println("Mid-->实例初始化块");}public Mid() {System.out.println("Mid-->无参构造器");}public Mid(String msg) {// 调用同一个类中的无参构造器this();System.out.println("Mid-->有参构造器,参数:" + msg);}
}

Leaf

public class Leaf extends Mid{static {System.out.println("Leaf-->静态初始化块");}{System.out.println("Leaf-->实例初始化块");}public Leaf() {super("java");System.out.println("Leaf-->无参构造器");}
}

Application

public class Application {public static void main(String[] args) {new Leaf();System.out.println("-------------------");new Leaf();}
}

结果

Root-->静态初始化块
Mid-->静态初始化块
Leaf-->静态初始化块
Root-->实例初始化块
Root-->无参构造器
Mid-->实例初始化块
Mid-->无参构造器
Mid-->有参构造器,参数:java
Leaf-->实例初始化块
Leaf-->无参构造器
-------------------
Root-->实例初始化块
Root-->无参构造器
Mid-->实例初始化块
Mid-->无参构造器
Mid-->有参构造器,参数:java
Leaf-->实例初始化块
Leaf-->无参构造器

相关文章:

Java 初始化块

文章目录1、初识初始化块2、实例初始化块和构造器3、类初始化块1、初识初始化块 Java 使用构造器来对单个对象进行初始化操作,使用构造器先完成对整个 Java 对象的状态初始化,然后将 Java 对象返回给程序,从而让该 Java 对象的信息更加完整。…...

超详细讲解长度受限制的字符串函数(保姆级教程!!!)

超详细讲解长度受限制的字符串函数(保姆级教程!!!)长度受限制的字符串函数strncpy函数strncpy函数的使用strncpy函数的模拟实现strncat函数strncat函数的使用strncat函数的模拟实现strncmp函数strncmp函数的使用strncm…...

【c#】c#常用小技巧方法整理(4)——cmd命令提示符,c#调用cmd

CMD命令是一种命令提示符,CMD是command的缩写,位于系统System32的目录下,是大多数Windows操作系统中可用的命令行解释器应用程序。用于执行输入的命令。其中大多数命令通过脚本和批处理文件自动执行任务,执行高级管理功能&#xf…...

在项目中遇到的关于form表单的问题

前言 以下内容都是基于element Plus 和 vue3 一个form-item校验两个下拉框 有时候不可避免会遇到需要一个form-item校验两个下拉框的情况,比如: 这种情况下传统的校验已经无法实现,需要通过form表单提供的自定义校验来实现。以上面的必填…...

德国奔驰、博世和保时捷的员工年薪有多少?

点击 欧盟IT那些事 关注我们公告:因企鹅审核规定,本公众号从《德国IT那些事》更名为《欧盟IT那些事》。从职场新人到总裁,一个个盘。位于德国斯图加特的梅赛德斯-奔驰集团及其子公司梅赛德斯-奔驰是世界最知名的汽车制造商之一。奔驰车代表着…...

Mybatis与微服务注册

目录 一,Springboot整合MybatisPlus 创建商品微服务子模块 二,SpringBoot整合Freeamarker 三、SpringBoot整合微服务 &gateway&nginx 整合微服务之商品服务zmall-product 创建并配置网关gateway服务 安装配置SwitchHosts 安装配置Windo…...

JAVA练习47-合并两个有序数组

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-合并两个有序数组 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 2月11日练习…...

右键菜单管理 - Win系统

右键菜单管理 - Win系统前言软件工具管理右键菜单360右键管理右键管家前言 Windows系统可以借助软件工具对右键菜单进行管理,可对指定的右键菜单进行删除和恢复。下面以Win10系统为例介绍管理方法。 注意:使用本文提及的工具将某软件的右键菜单删除后&…...

背包问题求方案数、具体方案

背包问题求方案数、具体方案01背包问题求体积恰好等于V的方案数完全背包问题求体积恰好等于V的方案数01背包问题求最优选法的方案数完全背包问题求最优选法的方案数01背包问题求具体方案01背包问题求体积恰好等于V的方案数 原题链接AcWing278. 数字组合 考虑状态表示&#x…...

电商导购CPS,淘宝联盟如何跟单实现用户和订单绑定

前言 大家好,我是小悟 做过自媒体的小伙伴都知道,不管是发图文还是发短视频,直播也好,可以带货。在你的内容里面挂上商品,你自己都不需要囤货,如果用户通过这个商品下单成交了,自媒体平台就会…...

【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc,bmc_wtd,

文章目录1.shell语法:Shell是用C语言编写的程序,它是用户使用Linux的桥梁,硬件>内核(os)>shell>文件系统1.1 变量:readonly定义只读变量,unset删除变量1.2 函数:shell脚本传递的参数中包含空格&am…...

刷题记录:牛客NC208250牛牛的最美味和最不美味的零食

传送门:牛客 题目描述: 牛牛为了减(吃)肥(好),希望对他的零食序列有更深刻的了解,所以他把他的零食排成一列,然后对每一 个零食的美味程度都打了分,现在他有可能执行两种操作&…...

微搭低代码从入门到精通08-轮播容器

我们上一篇讲解了基础布局组件,讲解了普通容器和文本组件的用法,本篇我们继续介绍布局组件。 小程序中经常会有个功能是轮播图展示的功能,多张图片可以顺序进行切换。我们学习使用轮播容器的时候,先考虑切换的图片从哪来&#xf…...

分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测

分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测 目录分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测分类效果基本介绍模型描述程序设计参考文献分类效果 基本介绍 1.Matlab实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测&…...

华为10年经验测试工程师,整理出来的python自动化测试实战

前言 全书共分11章,第一章是基础,了selenium家谱,各种组件之间的关系以及一些必备知识。第二章告诉如何开始用python IDLE写程序以及自动化测试环境的搭建。第三章是webdriver API,我花了相当多时间对原先的文档,冗余…...

OpenCV杂谈 - 如何导出图像到内存中其他结构

前言 最近在net环境使用OpenCV,记录些疑难杂点. ​​​ 一、OpenCV主要结构 Mat 二、Cols,Rows 和 Width,Hight 三、导入\导出到内存中其他结构 四、按矩形 在Mat之间复制 总结 一、OpenCV主要结构 Mat Mat是OpenCV中的主要结构. 主要有两个用途. 1 存储图片信息,2 存…...

Session与Cookie的区别(四)

咖啡寄杯的烦恼 虽然店里生意还可以,但小明无时无刻不想着怎么样发大财赚大钱,让店里的生意变得更好。 他观察到最近好多便利商店开始卖起了咖啡,而且时不时就买一送一或是第二件半价,并且贴心地提供了寄杯的服务。 寄杯就是指说你…...

Linux 文件锁 - fcntl

什么是文件锁&#xff1f; 即锁住文件&#xff0c;不让其他程序对文件做修改&#xff01; 为什么要锁住文件&#xff1f; 案例&#xff0c;有两个程序&#xff0c;都对一个文件做写入操作。 #include <unistd.h> #include <stdio.h> #include <stdlib.h> …...

CellularAutomata元胞向量机-2-初等元胞自动机MATLAB代码分享

%% 二维元胞自动机%imagesc(a)的色度矩阵a中0->256由蓝变黄% 规则&#xff0c;先把中间点置为1&#xff0c;每一时间每一点如果%周围八个点和为偶数&#xff0c;则变为0&#xff0c;为奇数则变为 1% 颜色控制clc, clearMap [1 1 1; 0 0 0];% [0 0 0] is black, [1 1 1] is …...

OpenStack云平台搭建(6) | 部署Neutron

目录 1.在控制节点登录数据库配置 2.要创建服务证书&#xff0c;完成这些步骤 3.创建网络服务API端点&#xff1a; 4.安装网络组件 5.配置neutron组件 6.配置 Modular Layer 2 (ML2) 插件 7.配置Linuxbridge代理 8.配置DHCP代理 9.配置元数据代理 10.编辑/etc/nova/no…...

Lesson 05.Configuring the Oracle Network Environment

Lesson 05. Configuring the Oracle Network Environment 文章目录Lesson 05. Configuring the Oracle Network Environment1. 监听程序的配置文件有哪些&#xff0c;如何命名&#xff0c;保存在什么位置&#xff1f;2. Oracle 网络的服务名称文件是如何命名的&#xff0c;需要…...

理论五:接口vs抽象类的区别,如何用普通的类模拟抽象类和接口

在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设计原则,使用抽象类来实现面向对象的继承特性和模板设计模…...

【Hello Linux】 Linux的权限以及Shell原理

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的基础命令 Linux的权限以及Shell原理Shell的运行原理权限Linux中权限的概念如何切换用户如何提升当前操作的权限如何添加信任…...

【STM32】【HAL库】遥控关灯2 分机

相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 接收RF433和红外信号,根据信号内容控制舵机 硬件设计 主控采用stm32F103c6 STM32 433接收 其他接口 软件设计 接…...

代码随想录算法训练营第27天|● 93.复原IP地址 ● 78.子集 ● 90.子集II

93.复原IP地址 看完题后的思路 典型分割问题略lue略剪枝条件 sub&#xff1a; 1&#xff09; 不是一位首字母为0 2&#xff09;大于三位 3&#xff09;介于0-255之间 4) 当已分割得到3个时&#xff0c;第四个直接从startIndex到末尾就行 代码 ArrayList<String> slist…...

Unity UI合批的问题

今天看到一个问题&#xff0c;主要说的是Unity中的UI资源合批的问题之前一直以为主要和UI资源在Hierarchy中的排列顺序有关&#xff0c;但其实这并不是最主要的&#xff0c;因为Unity会对同一个Canvas下的UI进行排序&#xff08;注&#xff1a;不同Canvas下的资源是不能够合批的…...

MWORKS--系统建模与仿真

MWORKS--系统建模与仿真1 系统定义特征2 系统研究2.1 特点与原则2.2 方法百度百科归纳同元杠归纳3 系统建模与仿真3.1 系统、模型、仿真的关系3.2 系统建模4 建模方法4.1 方法4.2 一般流程4.3 目的5 仿真方法5.1 方法5.2 流程参考1 系统定义 系统是由相互作用相互依赖的若干组…...

PC端开发GUI

PC端开发GUI 一、搭建PC端环境:常规方式1、Python2、Pycharm二、搭建PC端环境:创建虚拟环境1、创建文件夹存放虚拟环境相关2、配置环境变量3、创建.ui文件4、.ui文件转成.py文件5、打包.py文件来发布.exe一、搭建PC端环境:常规方式 1、Python 注意Python版本不能超过3.9,…...

解读手机拍照的各个参数(拍照时,上面会有6个符号)

1第一个符号是闪光灯符号&#xff0c;如下图所示。有四种模式&#xff0c; 手机的闪光灯分别为关闭、自动、开启和常亮四种状态。 关闭&#xff1a;就是在任何情况下都不会闪光 自动&#xff1a;由手机来判断此时的光线强弱&#xff0c;若手机测光认为光线太弱&#xff0c;则…...

数字钥匙最新进展文章

在未来出行上&#xff0c;智能汽车越来越卷。 新车除了拼高精度激光雷达、堆大算力芯片、标配辅助驾驶、智能语音识别&#xff0c;还在车钥匙上展开了激烈角逐&#xff0c;越来越多的厂商开始在量产车型上搭载数字钥匙&#xff0c;实现无钥匙进入车内。 去年1月蔚来发布轿车E…...

wordpress flash插件/关键词权重

在我的博客点击打开链接&#xff0c;对URl对应的网页进行解析的博客中&#xff0c;我们使用了一个链接地址进行解析&#xff0c;但是当遇到&等特殊字符的时候&#xff0c;这些特殊字符后面的数据就会被截断。 我们可以使用Jquery Ajax 对的接口进行访问&#xff0c;接口实现…...

绿色郑州网站/最有效的恶意点击

原文地址为&#xff1a; CentOS 6.3下源码安装LAMP(LinuxApacheMysqlPhp)环境一、简介 什么是LAMP LAMP是一种Web网络应用和开发环境&#xff0c;是Linux, Apache, MySQL, Php/Perl的缩写&#xff0c;每一个字母代表了一个组件&#xff0c;每个组件就其本身而言都是在它所代…...

简网app工场在线制作/seo sem论坛

能量模型&#xff08;Energy-based model&#xff09;是一种以自监督方式执行的生成式模型&#xff0c;近年来受到了很多关注。本文将介绍ScoreGrad&#xff1a;基于连续能量生成模型的多变量概率时间序列预测。如果你对时间序列预测感兴趣&#xff0c;推荐继续阅读本文。 为什…...

正能量网站下载/四年级写一小段新闻

先简单写下观察者模式。观察者模式&#xff0c;又叫做发布-订阅模式。观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;是他们能够自动更新自己。 1 ///…...

网站设计怎么收费/百度网页版主页网址

如果你还想从头学起Pytest&#xff0c;可以看看这个系列的文章哦&#xff01; https://www.cnblogs.com/poloyy/category/1690628.html 前言 为了提高复用性&#xff0c;我们在写测试用例的时候&#xff0c;会用到不同的fixture&#xff0c;比如&#xff1a;最常见的登录操作&a…...

建设网站对于客户/百度网盘资源分享

由于name是随机的&#xff0c;要定位name比较困难&#xff0c;此处由于iframe的标签是唯一的&#xff0c;所以可以用tag_name定位1 framenamedriver.find_element_by_tag_name("iframe") 2 driver.switch_to_frame(framename) View Code2. 先记录在这有更好的方法再更…...