java中static相關問題,執行順序等

2021-07-27 21:23:28 字數 2249 閱讀 8678

成員變數:

在類體裡面定義的變數稱為成員變數;

如果該成員變數有 static 關鍵字修飾,則該成員變數稱為 

靜態變數

或 類變數

;如果該成員變數沒有 static 關鍵字修飾,則該成員變數被稱為 

非靜態變數

或 例項變數

。區域性變數:

形參、方法內定義的變數、**塊中定義的變數,都屬於區域性變數。

類變數 (靜態變數

1. 可以向前引用

2. 變數屬於類本身

3. 類變數不依賴類的例項,類變數只在初始化時候在棧記憶體中被分配一次空間,無論類的例項被建立幾次,都不再為類變數分配空間

4. 通過類的任意乙個例項來訪問類變數,底層都將將其轉為通過類本身來訪問類變數,它們的效果是一樣的

5. 一旦類變數的值被改變,通過類或類的任意乙個例項來訪問類變數,得到的都將是被改變後的值

6. 將在類的初始化之前初始化

例項變數(非靜態變數)

1. 不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的

2. 變數屬於類的例項物件

3. 隨著類的例項被建立而分配記憶體空間

非靜態**塊

直接由 包起來的**,稱為非靜態**塊

靜態**塊

直接由 static 包起來的**,稱為靜態**塊

類變數(靜態變數)、例項變數(非靜態變數)、靜態**塊、非靜態**塊 的初始化時機

由 static 關鍵字修飾的(如:類變數[靜態變數]、靜態**塊)將在類被初始化建立例項物件之前被初始化,而且是按順序從上到下依次被執行;

沒有 static 關鍵字修飾的(如:例項變數[非靜態變數]、非靜態**塊)初始化實際上是會被提取到類的構造器中被執行的,但是會比類構造器中的

**塊優先執行到,其也是按順序從上到下依次被執行。

public class staticdemo 

static

static void print()

public staticdemo()

public static void main(string args)

}

直接使用類.靜態方法得到以下方法

輸出結果如下:

靜態**塊執行了

靜態**塊2執行了

靜態方法**塊執行了

非靜態**塊執行了

構造方法**塊執行了

主方法**塊執行了

解釋:先執行靜態**塊,從上到下的順序執行

(2)如果例項化物件之後,如果有非靜態**塊,那麼先執行非動態**塊,在執行建構函式,在執行別的方法(例如把上述的靜態方法sd.print()在例項化用例項化物件來呼叫,結果如下:

靜態**塊執行了

靜態**塊2執行了

非靜態**塊執行了

構造方法**塊執行了

靜態方法**塊執行了

主方法**塊執行了

靜態變數:

可以為 類變數(與物件無關),而 例項變數則屬於乙個特定的物件。

靜態變數有兩種情況:

1.靜態變數是 基本資料型別,這種情況下在類的外部不必建立該類的例項就可以直接使用

2.靜態變數是乙個 引用。這種情況比較特殊,主要問題是由於靜態變數是乙個物件的引用,那麼必須初始化這個物件之後才能將引用指向它。

因此如果要把乙個引用定義成static的,就必須在定義的時候就對其物件進行初始化。

靜態**塊:

靜態**塊主要用於類的初始化。它只執行一次,並在main函式之前執行。

靜態**塊的特點主要有:

1.靜態**塊會在類被載入時自動執行。

2. 靜態**塊只能定義在類裡面,不能定義在方法裡面。

3. 靜態**塊裡的變數都是區域性變數,只在塊內有效。

4. 乙個類中可以定義多個靜態**塊,按順序執行。

5. 靜態**塊只能訪問類的靜態成員,而不允許訪問例項成員。

靜態方法:

與 類變數(靜態變數) 不同,方法(靜態方法與例項方法)在記憶體中只有乙份,無論該類有多少個例項,都共用乙個方法。

靜態方法與例項方法的不同主要有:

1.靜態方法可以直接使用,而 例項方法必須在類例項化之後通過物件來呼叫。

2. 在外部呼叫靜態方法時,可以使用「類名.方法名」或者「物件名.方法名」的形式。例項方法只能使用後面這種方式。

3.靜態方法只允許訪問靜態成員。而例項方法中可以訪問靜態成員和例項成員。

4.靜態方法中不能使用this(因為this是與例項相關的)。

Java相關學習 5 屬性,static,記憶體

一 屬性 封裝 屬性私有方法公有 無參構造器,有參構造器,set get方法 再寫乙個tostring 方便測試 當屬性變為私有時 一定要寫get,set方法提供獲取和修改屬性 二 static static可以修飾變數也可以修飾屬性和 塊 static修飾的方法在呼叫其他方法時其他方法也應該是st...

Java中static方法疑惑

1 關於,main方法是static方法,但是為什麼非要是static。原因就是,如果乙個類她定義了main方法的話,那麼她的main方法會在這個類的建構函式執行之前被呼叫。由於main方法執行的時候尚未在jvm裡生成相應物件 建構函式未被執行 所以要宣告為static。2 這就涉及到下面的問題,和...

了解Java中的Static

class person string name double money 如果我們有10個人,每個人錢包,裡面有5元錢。person 張三 new person 張三花掉5元錢後,自己的錢包就沒有錢了,而其它9個人的錢都沒有發生變化,因為個人都有自己的錢包。class person string ...