【Java】 5.9 初始化块
目录
初始化块的语法
静态类的初始化
初始化块的语法
[修饰符] {//可执行语句}
【注意】修饰符只能出现static
- 有static,说明它是类初始化块/静态初始化块
- 没有static,说明它是实例初始化块/非静态初始化块
- 由于初始化块没有名字,所以他只能被“隐式”执行
【将初始化代码提取成初始化块】
【一些细节】
- 实例初始化到底何时会被执行?
- 实例初始化块代码,会在【每次调用构造器之前】被隐式执行
- 规则:【位于构造器前面】的、而且【无需传入参数】的代码就可被提取到初始化块中
- 实例初始化块和构造器的作用几乎相同,但实例初始化块的优先级更高
- 实例初始化块包含的代码,总是在构造器包含的代码之前执行
- Java允许提供多个实例初始化块,至少目前为止没有发现多个实例初始化块的价值。所以不如合并为一个。
- JDK编译器会把【实例初始化块的代码】,【声明field时候指定初始值的代码】都提取到构造器的“最前面”
- 【实例初始化块的代码】与
- 【声明field时候指定初始值的代码】按它们在源代码中顺序执行
public class Person {//下面定义一个初始化块{int a=6;if(a>4) {System.out.println("Person初始化块:局部变量a的值大于4");}System.out.println("Person的初始化块");}//定义第二个初始化块{System.out.println("Person的第二个初始化块");}//定义无参数构造器public Person() {System.out.println("Person类的无参数构造器");}public static void main(String[] args) {new Person();}
}
输出结果:优先执行初始化块,多个初始化块之间按顺序执行下去,然后开始初始化实例,从初始化构造器开始
===========================================================================
静态类的初始化
类初始化:当程序第一次【主动】使用该类就会初始化该类。下面几种情况会初始化该类:
- 访问了该静态field或静态方法
- 初始化了该类的子类 —— 因为Java初始化一个类,永远先从顶层父类(object)开始初始化
- 使用反射来Class.ForName(类名字符串)
- 如果该类作为主类使用(有main方法,而且程序确实从该main方法开始执行)
- 典型的,使用类来声明变量,并不算使用该类
class Root{//类初始化块static {System.out.println("Root的静态初始化块");}{System.out.println("Root的普通初始化块");}public Root() {System.out.println("Root的无参数构造器");}
}class Mid extends Root{static {System.out.println("Mid的静态初始化块");}{System.out.println("Mid的普通初始化块");}public Mid() {System.out.println("Mid的无参数构造器");}public Mid(String msg) {//通过this调用同一类中重载构造器this();System.out.println("Mid的带参数构造器,其参数值:"+msg);}
}class Leaf extends Mid{static {System.out.println("Leaf的静态初始化块");}{System.out.println("Leaf的普通初始化块");}public Leaf() {//调用父类的一个字符串构造器super("Java笔记");System.out.println("执行Leaf的构造器");}
}
public class Test {public static void main(String[] args) {new Leaf();new Leaf();}
}
【代码分析】执行流程为:静态初始化块(静态初始化块仅初始化【一次】) → 按类的继承等级从上到下运行初始化块
运行结果:
【Java】 5.9 初始化块相关推荐
- java 静态块初始化_简单了解java中静态初始化块的执行顺序
这篇文章主要介绍了简单了解java中静态初始化块的执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在java中,其应该是先于所有的方法执行. ...
- 浅谈 JAVA中静态初始化块和非静态初始化块的区别
众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...
- java面向对象-------静态初始化块
1.构造方法用于对象的初始化!静态初始化块,用于类的初始化操作,在静态初始化块中不能直接访问非static成员. package java面向对象; /** * 测试静态初始化块 */public c ...
- java里的初始化块_[转载] Java 语言中的实例初始化块 ( IIB) 详解
参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...
- 关于Java的静态初始化块
这里我们主要讨论下静态初始化块这种情况. 静态初始化块是在类被加载的时候就执行的一块程序,并且一直存在直到程序关闭.也就是说当程序被执行,即classloader将该java程序编译后的class文件 ...
- JAVA抽象类接口初始化块实验_抽象类和接口 - 逝水无痕7777的个人空间 - OSCHINA - 中文开源技术交流社区...
抽象类和接口 1.抽象类 抽象方法是只有方法签名,没有方法实现的方法.有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法.抽象方法和抽象类必须使用abstract修饰符来定义. 抽象类不能被实例 ...
- 零基础Java学习之初始化块
初始化块 初始化块是类的五大成员之一,其包括类初始化块和实例初始化块 类初始化块 静态代码块 语法格式: [修饰符] class 类名{static{静态代码块语句;} } 位置:在类中方法外,一个类 ...
- 什么是Java实例初始化块
在本篇文章,我将会使用一个例子展示什么是实例变量初始化块,实例初始化块和静态初始化块,然后说明在Java中实例初始化块是如何工作的. 执行顺序 查看下面的代码,你知道哪个先执行吗? package s ...
- java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题
2019独角兽企业重金招聘Python工程师标准>>> /* * 几大原则 * 一.静态成员变量(Static) * 1.静态成员变量为类变量,所有对象共享同一内存空间 * 2.静态 ...
- Java的知识点10——static关键字、静态初始化块、 参数传值机制、包、导入类import、 静态导入
static 关键字 在类中,用static声明的成员变量为静态成员变量,也称为类变量. 类变量的生命周期和类相同,在整个应用程序执行期间都有效.它有如下特点: 1. 为该类的公用变量,属于类,被该类 ...
最新文章
- c语言aba字母塔,打印字母金字塔,昨晚看到某个帖子的题目
- 反弹和补遗:再论Bjarne Stroustrup的基于对象的含义
- C#开发学习——内联表达式
- linux工科软件,linux基础网络工具学习笔记
- 二进制文件后缀_ZSY2018综合录井仪的数据流与数据文件
- javaweb学习总结(五):Servlet开发(一)
- c语言中x的n次方怎么表示_线性代数的本质及其在AI中的应用
- 推荐系统(1)-概述
- mysql的使用优化问题吗_如何对 mysql 进行优化的问题
- python遗传算法工具箱的使用_Python遗传算法框架——Geatpy学习笔记(一)
- Android TV 焦点控制
- 旅游新纪元紫山缭绕,静思生活
- 不熟悉 excel,使用 python 将数据按要求转置
- 辨析NOR FLASH地址左右移的问题
- Modeling Conversation Structure and Temporal Dynamics for Jointly Predicting Rumor Stance and Veraci
- H5电玩城源码+玩法比较多+UI也特别好看+纯源码系列
- 语句摘抄——第25周
- DeFi明斯基时刻:压力测试与启示
- 简析BlockingQueue
- vs编写java_vs code编写java
热门文章
- WinCE 系统刚启动时运行应用,在应用启动时偶尔出现异常
- 自定义Dictionary支持线程安全
- 11.05 scrum report
- Asp.Net 2.0中的客户端脚本
- TSM12M触摸芯片注意事项
- C++ Primer 5th笔记(chap 17 标准库特殊设施)流随机访问
- (chap4 Http状态码) 4XX
- [力扣leetcode319]灯泡问题
- [密码学] 消息认证码构造方法
- 关于“ModuleNotFoundError: No module named ‘flask._compat‘”的解决