Java中靜態代碼塊、構造代碼塊、普通代碼塊 [復制鏈接]

2019-7-29 15:40
BlueManlove 閱讀:549 評論:0 贊:0
Tag:  Java 靜態代碼塊

靜態代碼塊

①、格式

在java類中(方法中不能存在靜態代碼塊)使用static關鍵字和{}聲明的代碼塊:

public class Student {
static{
System.out.println("靜態代碼塊");
}
}

②、執行時機

靜態代碼塊在類被加載的時候就運行了,而且只運行一次,并且優先于各種代碼塊以及構造函數。如果一個類中有多個靜態代碼塊,會按照書寫順序依次執行。

③、靜態代碼塊的作用

一般情況下,如果有些代碼需要在項目啟動的時候就執行,這時候就需要靜態代碼塊。比如一個項目啟動需要加載的很多配置文件等資源,我們就可以都放入靜態代碼塊中。

④、靜態代碼塊不能訪問普通變量

普通變量只能通過對象來調用,是不能放在靜態代碼塊中的

構造代碼塊

①、格式

在java類中使用{}聲明的代碼塊(和靜態代碼塊的區別是少了static關鍵字):

public class Student {
static{
System.out.println("靜態代碼塊");
}
{
System.out.println("構造代碼塊");
}
}

②、執行時機

構造代碼塊在創建對象時被調用,每次創建對象都會調用一次,但是優先于構造函數執行。構造代碼塊依托于構造函數,也就是說,如果你不實例化對象,構造代碼塊是不會執行的。

③、構造代碼塊的作用

和構造函數的作用類似,都能對對象進行初始化,并且只要創建一個對象,構造代碼塊都會執行一次。但是反過來,構造函數則不一定每個對象建立時都執行(多個構造函數情況下,建立對象時傳入的參數不同則初始化使用對應的構造函數)。

利用每次創建對象的時候都會提前調用一次構造代碼塊特性,我們可以做諸如統計創建對象的次數等功能。

普通代碼塊

普通代碼塊和構造代碼塊的區別是,構造代碼塊是在類中定義的,而普通代碼塊是在方法體中定義的。且普通代碼塊的執行順序和書寫順序一致。

public void sayHello(){
{
System.out.println("普通代碼塊");
}
}

執行順序

靜態代碼塊>構造代碼塊>構造函數>普通代碼塊

public class Student {
static{
System.out.println("靜態代碼塊");
}
{
System.out.println("構造代碼塊");
}
public Student(){
System.out.println("無參構造函數");
}

public void sayHello(){
{
System.out.println("普通代碼塊");
}
}

public static void main(String[] args) {
System.out.println("執行了main方法");

new Student().sayHello();;
System.out.println("---------------");
new Student().sayHello();;
}
}

執行結果:

Java中靜態代碼塊、構造代碼塊、普通代碼塊

父類和子類執行順序

對象的初始化順序:

首先執行父類靜態的內容,父類靜態的內容執行完畢后,接著去執行子類的靜態的內容,當子類的靜態內容執行完畢之后,再去看父類有沒有構造代碼塊,如果有就執行父類的構造代碼塊,父類的構造代碼塊執行完畢,接著執行父類的構造方法;父類的構造方法執行完畢之后,它接著去看子類有沒有構造代碼塊,如果有就執行子類的構造代碼塊。子類的構造代碼塊執行完畢再去執行子類的構造方法。

總之一句話,靜態代碼塊內容先執行,接著執行父類構造代碼塊和構造方法,然后執行子類構造代碼塊和構造方法。


我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

时时彩改欢乐生肖