21年9月28日___初始化块和构造器
类的初始化块和构造器
- java类在刚开始定义时或者类中的静态函数被初次引用时,调用类的初始化块或者构造器。
- 根据“复杂问题简单化,简单问题流程化”的思想,我们要减少初始化块的使用,不过了解其原理还是有助于我们
在别人面前装逼的对java的理解的。
For example:
例一:
public class Main {
// 静态变量
public static String staticField = "静态变量";
// 变量
public String field = "变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
// 初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
// 构造器
public Main() {
System.out.println("构造器");
}
public static void main(String[] args) {
System.out.println("Main函数");
new Main();
}
}
输出一:
静态变量
静态初始化块
Main函数
变量
初始化块
构造器
例二:
public class Main {
// 变量
public String field = "变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
// 初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
// 静态变量
public static String staticField = "静态变量";
//这里和上一个例子相比,只是简单的把静态变量的声明放到了静态初始化块的下面
// 构造器
public Main() {
System.out.println("构造器");
}
public static void main(String[] args) {
System.out.println("Main函数");
new Main();
}
}
输出二:
Main.java:6: error: illegal forward reference
System.out.println(staticField);
^
1 error
例三:
public class Main {
// 变量
public String field = "变量";
// 初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
// 静态变量
public static String staticField = "静态变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
//和例一相比,例三把静态变量和静态初始化块放到了变量和初始化块的下面
// 构造器
public Main() {
System.out.println("构造器");
}
public static void main(String[] args) {
System.out.println("Main函数");
new Main();
}
}
输出三:
静态变量
静态初始化块
Main函数
变量
初始化块
构造器
例四:
public class Main {
public static void main(String[] args) {
System.out.println("Main函数");
new Main();
}
// 构造器
public Main() {
System.out.println("构造器");
}
// 变量
public String field = "变量";
// 初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
// 静态变量
public static String staticField = "静态变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
}
输出四:
静态变量
静态初始化块
Main函数
变量
初始化块
构造器
例五:
public class Main {
// 静态变量
public static String staticField = "静态变量";
// 变量
public String field = "变量";
// 静态初始化块
static {
f();
System.out.println(staticField);
System.out.println("静态初始化块");
}
// 初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
// 构造器
public Main() {
System.out.println("构造器");
}
public static void main(String[] args) {
System.out.println("Main函数");
new Main();
}
public static void f() {
System.out.println("f函数");
}
}
输出五:
f函数
静态变量
静态初始化块
Main函数
变量
初始化块
构造器
例六:
public class Main {
// 静态变量
public static String staticField = "静态变量";
// 变量
public String field = "变量";
// 静态初始化块
static {
f();
System.out.println(staticField);
System.out.println("静态初始化块");
}
// 初始化块
{
ff();
System.out.println(field);
System.out.println("初始化块");
}
// 构造器
public Main() {
System.out.println("构造器");
}
public static void main(String[] args) {
System.out.println("Main函数");
new Main();
}
public static void f() {
System.out.println("f函数");
}
void ff() {
System.out.println("ff函数");
}
}
输出六:
f函数
静态变量
静态初始化块
Main函数
ff函数
变量
初始化块
构造器
总结:
- 一个类被使用时(也就是被生成或者内部静态函数被调用时),
- 扫描第一遍为其静态函数成员生成内存,
- 然后一遍扫描是这个类的静态变量和静态初始化块(谁在前面谁先被生成),
- 然后如果有main函数,运行其main函数,
- 下一遍为其普通函数成员分配内存,
- 下一遍扫描,为这个类的普通变量和普通初始化块分配内存,
- 最后一遍扫描才是运行其构造器函数

浙公网安备 33010602011771号