天天看點

java中靜态代碼塊的用法 static用法詳解(轉)

(一)java 靜态代碼塊 靜态方法差別

一般情況下,如果有些代碼必須在項目啟動的時候就執行的時候,需要使用靜态代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化,在不建立對象的情況下,其他程式來調用的時候,需要使用靜态方法,這種代碼是被動執行的. 靜态方法在類加載的時候 就已經加載 可以用類名直接調用

比如main方法就必須是靜态的 這是程式入口

兩者的差別就是:靜态代碼塊是自動執行的;

靜态方法是被調用的時候才執行的.

靜态方法

(1)在Java裡,可以定義一個不需要建立對象的方法,這種方法就是靜态方法。要實作這樣的效果,隻需要在類中定義的方法前加上static關鍵字。例如:

public static int maximum(int n1,int n2)

使用類的靜态方法時,注意:

a在靜态方法裡隻能直接調用同類中其他的靜态成員(包括變量和方法),而不能直接通路類中的非靜态成員。這是因為,對于非靜态的方法和變量,需要先建立類的執行個體對象後才可使用,而靜态方法在使用前不用建立任何對象。

b 靜态方法不能以任何方式引用this和super關鍵字,因為靜态方法在使用前不用建立任何執行個體對象,當靜态方法調用時,this所引用的對象根本沒有産生。

(2)靜态變量是屬于整個類的變量而不是屬于某個對象的。注意不能把任何方法體内的變量聲明為靜态,例如:

fun()

{

static int i=0;//非法。

}

(3)一個類可以使用不包含在任何方法體中的靜态代碼塊,當類被載入時,靜态代碼塊被執行,且隻被執行一次,靜态塊常用來執行類屬性的初始化。例如:

static

類裝載步驟

在Java中,類裝載器把一個類裝入Java虛拟機中,要經過三個步驟來完成:裝載、連結和初始化,其中連結又可以分成校驗、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:

裝載:查找和導入類或接口的二進制資料;

連結:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;

校驗:檢查導入類或接口的二進制資料的正确性;

準備:給類的靜态變量配置設定并初始化存儲空間;

解析:将符号引用轉成直接引用;

初始化:激活類的靜态變量的初始化Java代碼和靜态Java代碼塊。

初始化類中屬性是靜态代碼塊的常用用途,但隻能使用一次。

(二)靜态代碼塊的初始化順序

 class Parent{ 

static String name = "hello"; 

System.out.println("parent block"); 

static { 

System.out.println("parent static block"); 

public Parent(){ 

System.out.println("parent constructor"); 

class Child extends Parent{ 

static String childName = "hello"; 

System.out.println("child block"); 

System.out.println("child static block"); 

public Child(){ 

System.out.println("child constructor"); 

public class StaticIniBlockOrderTest { 

public static void main(String[] args) { 

new Child();//語句(*) 

問題:當執行完語句(*)時,列印結果是什麼順序?為什麼?

解答:當執行完語句(*)時,列印結果是這樣一個順序 :

 parent static block

child static block

parent block

parent constructor

child block

child constructor

分析:當執行new Child()時,它首先去看父類裡面有沒有靜态代碼塊,如果有,它先去執行父類裡面靜态代碼塊裡面的内容,當父類的靜态代碼塊裡面的内容執行完畢之後,接着去執行子類(自己這個類)裡面的靜态代碼塊,當子類的靜态代碼塊執行完畢之後,它接着又去看父類有沒有非靜态代碼塊,如果有就執行父類的非靜态代碼塊,父類的非靜态代碼塊執行完畢,接着執行父類的構造方法;父類的構造方法執行完畢之後,它接着去看子類有沒有非靜态代碼塊,如果有就執行子類的非靜态代碼塊。子類的非靜态代碼塊執行完畢再去執行子類的構造方法,這個就是一個對象的初始化順序。

總結:

對象的初始化順序:首先執行父類靜态的内容,父類靜态的内容執行完畢後,接着去執行子類的靜态的内容,當子類的靜态内容執行完畢之後,再去看父類有沒有非靜态代碼塊,如果有就執行父類的非靜态代碼塊,父類的非靜态代碼塊執行完畢,接着執行父類的構造方法;父類的構造方法執行完畢之後,它接着去看子類有沒有非靜态代碼塊,如果有就執行子類的非靜态代碼塊。子類的非靜态代碼塊執行完畢再去執行子類的構造方法。總之一句話,靜态代碼塊内容先執行,接着執行父類非靜态代碼塊和構造方法,然後執行子類非靜态代碼塊和構造方法。

注意:子類的構造方法,不管這個構造方法帶不帶參數,預設的它都會先去尋找父類的不帶參數的構造方法。如果父類沒有不帶參數的構造方法,那麼子類必須用supper關鍵子來調用父類帶參數的構造方法,否則編譯不能通過。

原位址:http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html