代码块使用细节
-
代码块的使用细节
- static代码块也叫做静态代码块,作用是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次,如果是普通代码块,每创建一个对象,就执行一次。
- 类会在什么时候被加载
- 创建对象实例的时候
- 创建子类对象实例,弗雷也会被加载
- 使用类的静态成员是(静态属性,静态方法)
- 普通的代码块,在创建对象实例的时候会被隐式的调用,被创建一次,就会调用一次
- 创建一个对象的时候,在一个类中的调用顺序是:
- 调用静态代码块和静态属性初始化,静态代码块和静态属性初始化调用的优先级是一样的,如果有多个静态代码块和多个静态变量初始化,则按照他们定义的顺序调用
- 调用普通代码块和普通属性的初始化,普通代码块和普通变量初始化调用的优先级一样,如果有多个普通代码块和多个普通实行初始化,则按定义顺序调用
- 调用构造方法
- 构造器的最前面其实隐含了super()和调用普通代码块
- 创建一个子类对象时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:
- 父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
- 子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
- 父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
- 父类的构造方法
- 子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
- 子类的构造方法
代码演示
package com.gqz.CodeBlock_; public class CodeBlockDetail { public static void main(String[] args) { new B01(); } } class A01 { private static int n1 = getVal01(); static {//(2) System.out.println("A的第一个静态代码块"); } {//(5) System.out.println("A的第一个普通代码块"); } public int n3 = getVal02(); public static int getVal01() {//(1) System.out.println("getVal01"); return 10; } public int getVal02() {//(6) System.out.println("getVal02"); return 10; } public A01(){//(7) System.out.println("A01构造器"); } } class B01 extends A01{ private static int n2 = getVal03(); static {//(4) System.out.println("B01的第一个静态代码块"); } {//(8) System.out.println("B01的第一个代码块"); } public int n4 = getVal04(); public static int getVal03(){//(3) System.out.println("getVal03"); return 10; } public static int getVal04(){//(9) System.out.println("getVal04"); return 10; } public B01(){//(10) System.out.println("这是B01的无参构造"); } }
输出结果如图
- 静态代码块只能调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)