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函数
  • 下一遍为其普通函数成员分配内存,
  • 下一遍扫描,为这个类的普通变量和普通初始化块分配内存,
  • 最后一遍扫描才是运行其构造器函数
posted @ 2021-09-28 15:00  zhuangzhongxu  阅读(35)  评论(0)    收藏  举报