java类静态初始化_Java静态代码块和类初始化、实例初始化过程
1. 静态代码块
静态代码块:定义在类中方法外,使用static修饰
①可以为类变量(静态变量)初始化
②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次
③若有多个静态代码块,那么按照定义的先后顺序依次执行
④在静态代码块中不能访问非静态成员(属性、方法、内部类)
⑤在静态代码块中不能使用this和super关键字
⑥静态代码块的执行优先于main方法、非静态代码块和构造方法的执行
⑦父类静态代码块的执行优先于子类静态代码块执行
代码示例:
public class StaticBlockTest {
public static void main(String[] args) {
MyClass.show();
MyClass.show();
MyClass.show();
}
static {
System.out.println("StaticBlockTest类静态代码块");
}
}
class MyClass {
static {
System.out.println("MyClass类静态代码块1");
}
public static void show() {
System.out.println("MyClass类静态方法");
}
static {
System.out.println("MyClass类静态代码块2");
}
}
运行结果:
StaticBlockTest类静态代码块
MyClass类静态代码块1
MyClass类静态代码块2
MyClass类静态方法
MyClass类静态方法
MyClass类静态方法
2. 类初始化
类初始化即执行类初始化方法:()
类初始化方法,一个类只有一个。它也是由编译器编译生成的,由两部分代码组成:
①静态变量的显式赋值代码
②静态代码块的代码
其中①和②是按定义的先后顺序依次执行的
代码示例:
public class InitTest {
public static void main(String[] args) {
MyClass my = new MyClass();
}
}
class MyClass {
static {
System.out.println("MyClass类静态代码块1");
}
private static String str = assingn();
public static void show() {
System.out.println("MyClass类静态方法");
}
private static String assingn() {
System.out.println("assign()方法为静态变量显式赋值");
return "java";
}
static {
System.out.println("MyClass类静态代码块2");
}
}
运行结果:
MyClass类静态代码块1
assign()方法为静态变量显式赋值
MyClass类静态代码块2
3. 子类初始化
一个类初始化时会先检查它的父类是否初始化,如果父类没有初始化,那么会先初始化父类
(1)父类的初始化()
父类的静态变量的显式赋值
父类的静态代码块
(2)子类的初始化()
父类的静态变量的显式赋值
父类的静态代码块
代码示例:
public class InitTest2 {
public static void main(String[] args) {
/*Father f = new Father();
System.out.println("--------分隔线---------");*/
Son s = new Son();
}
}
class Father{
private static String info = assign();
static{
System.out.println("父类的静态代码块");
}
//静态方法不能被重写
public static String assign(){
System.out.println("父类assign()方法");
return "Father";
}
}
class Son extends Father{
private static String info = assign();
static{
System.out.println("子类的静态代码块");
}
public static String assign(){
System.out.println("子类assign()方法");
return "Son";
}
}
运行结果:
父类assign()方法
父类的静态代码块
子类assign()方法
子类的静态代码块
4. 类初始化和实例初始化结合
先执行类初始化,后执行实例初始化
代码示例:
public class InitTest3 {
public static void main(String[] args) {
Demo d = new Demo();
}
}
class Demo{
{
System.out.println("非静态代码块1");
}
static{
System.out.println("静态代码块1");
}
public Demo(){
System.out.println("无参构造");
}
private static String info = assignInfo();
private String msg = assignMsg();
static{
System.out.println("静态代码块2");
}
{
System.out.println("非静态代码块2");
}
public static String assignInfo(){
System.out.println("assignInfo()方法");
return "hello";
}
public String assignMsg(){
System.out.println("assignMsg()方法");
return "msg";
}
}
运行结果:
静态代码块1
assignInfo()方法
静态代码块2
非静态代码块1
assignMsg()方法
非静态代码块2
无参构造
5. 子类初始化和子类实例初始化结合
执行顺序:①父类的类初始化 => ②子类的类初始化 => ③父类的实例初始化方法 => ④子类的实例初始化方法
public class InitTest4 {
public static void main(String[] args) {
//Father f = new Father();
Son s = new Son();
}
}
class Father {
{
System.out.println("父类非静态代码块1");
}
static {
System.out.println("父类静态代码块1");
}
private static String info = assignInfo();
private String msg = assignMsg();
public Father() {
System.out.println("父类无参构造");
}
static {
System.out.println("父类静态代码块2");
}
{
System.out.println("父类非静态代码块2");
}
public static String assignInfo() {
System.out.println("父类assignInfo()方法");
return "hello";
}
public String assignMsg() {
System.out.println("父类assignMsg()方法");
return "msg";
}
}
class Son extends Father {
{
System.out.println("子类非静态代码块1");
}
static {
System.out.println("子类静态代码块1");
}
private static String info = assignInfo();
private String msg = assignMsg();
public Son() {
System.out.println("子类无参构造");
}
static {
System.out.println("子类静态代码块2");
}
{
System.out.println("子类非静态代码块2");
}
public static String assignInfo() {
System.out.println("子类assignInfo()方法");
return "hello";
}
public String assignMsg() {
System.out.println("子类assignMsg()方法");
return "msg";
}
}
父类静态代码块1
父类assignInfo()方法
父类静态代码块2
子类静态代码块1
子类assignInfo()方法
子类静态代码块2
父类非静态代码块1
子类assignMsg()方法
父类非静态代码块2
父类无参构造
子类非静态代码块1
子类assignMsg()方法
子类非静态代码块2
子类无参构造
java类静态初始化_Java静态代码块和类初始化、实例初始化过程相关推荐
- java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解
本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...
- [转载] Java中静态成员变量,静态代码块,静态内部类何时被初始化?
参考链接: Java中的初始化程序块Initializer Block 关于这个问题,本文不扯理论,直接上代码,通过结果来验证结论,废话少说,测试代码如下: public class StaticTe ...
- java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序
1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...
- java静态代码块、静态方法、静态变量、构造代码块、普通代码块、成员变量执行顺序
package smartt.styy.auth.model.voRsp;public class Test {static {String test5="555";//局部变量t ...
- java 同步块原理_Java同步代码块和同步方法原理与应用案例详解
Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...
- Java基础篇:四种代码块详解
所谓代码块,就是用大括号{}将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说,代码块是不能单独运行的,它必须有运行主体.在Java中代码块主要分为四种:普通代码块.静态代码块. ...
- Java核心(三):代码块的作用
Java中用{ }括起来的代码段就是代码块,他分为如下几种类型 位置 作用 局部代码块 在方法当中使用,作用是控制变量的生命周期. 局部代码块的变量,只能在代码块内部使用,在执行结束后会被Java回收 ...
- Java里面static, final, this, super, 代码块, 单例模式
static关键字 package csdn;public class staticWord {public static void main(String[] args) {funStatic fs ...
- Java的static,final,代码块,内部类,抽象类,接口等
Java的static,final,代码块,内部类,抽象类,接口等 1 static关键字月final关键字 1.1 static static表示静态.可以修饰属性,方法,代码块内部类等,总结如下: ...
最新文章
- TD321DCAN 隔离CAN总线驱动器
- 解惑(二)----- 如何通俗地理解Python中的if __name__ == ‘__main__‘
- IDEA中Spring MVC实现图片上传并显示
- java兔子问题编程思路详解_Java算法之“兔子问题”
- 用sum函数求三个数和C语言,C语言用函数写两数之和.doc
- Project Chameleon Work In Progress 12
- STM32之定时器中断控制LED闪烁
- 我为什么放弃了 Chrome?
- python 用 __all__ 暴露接口
- Linux系统修改编码(转)
- android5.1蓝牙opp协议去掉Notification和Dialog操作提示
- qtvs添加qchart_如何使用Qt Designer在表单中插入QChartView?
- 数组字符串转int数组_7.5 C++字符串数组 | 字符串数组输出
- 解决Echarts官网无法访问的问题
- Linux(二、三、四)简单命令、系统目录结构、文件类型、命令行管理文件学习
- Freenom申请免费域名
- paper reading: Rob-GAN: Generator, Discriminator, and Adversarial Attacker
- 汇川机器人视觉定位通讯程序
- 排球分组循环交叉编排_学校2020年教职工气排球比赛圆满落幕
- 几何分布的概率和期望
热门文章
- 大数据分析平台的功能
- 输出矩阵的左下半三角
- 2018年php框架,2018年的7个热门网站开发框架
- 连接设备不支持android,安卓手机不识别U盘、不能连接PC的处理方法
- 永恒python怎么用_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!
- 1. C++基础知识学习及其深入理解(面向对象部分还没学) -- 课程1完成
- java8 多行字符串_JDK8字符串拼接的正确姿势
- Java连Mysql数据库
- MySQL忘记root密码--不重启mysqd重置root密码
- 介绍两个Ubuntu上的桌面小工具