Java之static靜態代碼塊
構造代碼塊
使用{}
包裹的代碼區域,這里的代碼區域特指位於class{}
下面的而不是存在於其他type method(){}
這類函數下面的代碼區域
public class HelloA {
/**
...
*/
{
System.out.println("I'm A construct code block");
}
}
構造函數代碼塊
構造函數代碼塊指的是構造函數中所包含的代碼,類似 className(){}
中的代碼塊
public class HelloA {
public HelloA(){
System.out.println("I'm A construct method code block");
}
}
static代碼塊
static代碼塊指的是static{}
包裹的代碼塊,且靜態代碼只執行一次,可以通過Class.forName("classPath")
的方式喚醒代碼的static代碼塊,但是也執行一次。
public class HelloA {
static{
System.out.println("I'm A static code block");
}
}
三種代碼方式的執行順序
public class HelloA {
public HelloA(){
System.out.println("I'm A construct method code block");
}
{
System.out.println("I'm A construct code block");
}
static {
System.out.println("I'm A static code block");
}
public static void main(String[] args) {
new HelloA();
new HelloA();
}
}
result
I'm A static code block
I'm A construct code block
I'm A construct method code block
I'm A construct code block
I'm A construct method code block
可以看到顯示static代碼初始化,然后是構造方法初始化,然后是構造函數初始化,並且靜態代碼只會初始化一次。
為什么構造代碼塊一定在構造函數代碼塊前執行
這里可以直接代碼編譯后的文件HelloA.class
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
public class HelloA {
/*構造代碼塊直接被內聯到了構造函數代碼塊中*/
public HelloA() {
System.out.println("I'm A construct code block");
System.out.println("I'm A construct method code block");
}
public static void main(String[] args) {
new HelloA();
new HelloA();
}
static {
System.out.println("I'm A static code block");
}
}
因此得出結論構造代碼塊直接被內聯到構造函數代碼塊中
並且還可以推論可以直接在構造代碼塊中調用this
或者調用this.method()
或者this.staticMethod()
;
加上繼承的情況
public class HelloB extends HelloA {
{
System.out.println("I'm A construct code block");
}
public HelloB() {
System.out.println("I'm A construct method code block");
}
static {
System.out.println("I'm B static code block");
}
public static void main(String[] args) {
new HelloB();
}
}
result
I'm A static code block
I'm B static code block
I'm A construct code block
I'm A construct method code block
I'm A construct code block
I'm A construct method code block
初始化的整體順序可以漸進的表示為
static > instace
有繼承初始化順序:
另一個靜態提升的題見csdn
https://blog.csdn.net/harryptter/article/details/87875399#筆試題