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

來源:互聯網
上載者:User

標籤:

一)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"); } static { 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 blockchild static blockparent blockparent constructorchild blockchild constructor

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

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

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

 

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

註:這裡的非靜態代碼塊叫做:構造代碼塊

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.