一、静态代码块
- 里面可以有输出语句
- 随着类的加载而加载,而且只被加载一次
- 多个静态代码块之间按照顺序结构执行
- 静态代码块的执行要早于非静态代码块的执行。
- 静态的代码块中只能执行静态的结构(类属性,类方法)
二、非静态代码块
- 可以对类的属性(静态的 & 非静态的)进行初始化操作,同时也可以调用本类声明的方法(静态的 & 非静态的)
- 里面可以有输出语句
- 一个类中可以有多个非静态的代码块,多个代码块之间按照顺序结构执行
- 每创建一个类的对象,非静态代码块就加载一次
- 非静态代码块的执行要早于构造器
注意:代码块如果有修饰的话,那么只能使用static
package com.yyx.pratice; 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调用父类中有一个字符串参数的构造器 super("尚硅谷"); System.out.println("执行Leaf的构造器"); } } public class TestLeaf { public static void main(String[] args) { new Leaf(); System.out.println(); new Leaf(); } }
运行结果:
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:尚硅谷
Leaf的普通初始化块
执行Leaf的构造器
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:尚硅谷
Leaf的普通初始化块
执行Leaf的构造器