成員變數:
在類體裡面定義的變數稱為成員變數;
如果該成員變數有 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 ...