標籤:
①java類的成員變數有倆種: 一種是被static關鍵字修飾的變數,叫類變數或者靜態變數 另一種沒有static修飾,為成員變數 ②通俗點說: 類的靜態變數在記憶體中只有一個,java虛擬機器在載入類的過程中為靜態變數分配記憶體,靜態變數位於方法區,被類的所有執行個體共用。靜態變數可以直接通過類名進行訪問,其生命週期取決於類的生命週期。 而執行個體變數取決於類的執行個體。每建立一個執行個體,java虛擬機器就會為執行個體變數分配一次記憶體,執行個體變數位於堆區中,其生命週期取決於執行個體的生命週期。 注意點: 1.JAVA中初始化的順序: 載入類; 靜態變數初始化; 靜態塊;【其只能調度靜態,不能調度非靜態】 成員變數; 構造方法; 2.為顯示靜態塊的優先順序,我來顯示一個沒有Main方法的程式,javac後其是沒有任何錯誤的。public class Test { static { System.out.println("static "); System.exit(0); }}
java 中的變數大致分為 成員變數 和 局部變數 兩大類。
成員變數:
在類體裡面定義的變數稱為成員變數;
如果該成員變數有 static 關鍵字修飾,則該成員變數稱為 靜態變數 或 類變數;
如果該成員變數沒有 static 關鍵字修飾,則該成員變數被稱為 非靜態變數 或 執行個體變數。
局部變數:
形參、方法內定義的變數、代碼塊中定義的變數,都屬於局部變數。
類變數 (靜態變數)
1. 可以向前引用
2. 變數屬於類本身
3. 類變數不依賴類的執行個體,類變數只在初始化時候在棧記憶體中被分配一次空間,無論類的執行個體被建立幾次,都不再為類變數分配空間
4. 通過類的任意一個執行個體來訪問類變數,底層都將將其轉為通過類本身來訪問類變數,它們的效果是一樣的
5. 一旦類變數的值被改變,通過類或類的任意一個執行個體來訪問類變數,得到的都將是被改變後的值
6. 將在類的初始化之前初始化
執行個體變數(非靜態變數)
1. 不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的
2. 變數屬於類的執行個體對象
3. 隨著類的執行個體被建立而分配記憶體空間
非靜態代碼塊
直接由 { } 包起來的代碼,稱為非靜態代碼塊
靜態代碼塊
直接由 static { } 包起來的代碼,稱為靜態代碼塊
類變數(靜態變數)、執行個體變數(非靜態變數)、靜態代碼塊、非靜態代碼塊 的初始化時機
由 static 關鍵字修飾的(如:類變數[靜態變數]、靜態代碼塊)將在類被初始化建立執行個體對象之前被初始化,而且是按順序從上到下依次被執行;
沒有 static 關鍵字修飾的(如:執行個體變數[非靜態變數]、非靜態代碼塊)初始化實際上是會被提取到類的構造器中被執行的,但是會比類構造器中的
代碼塊優先執行到,其也是按順序從上到下依次被執行。
static final變數,必須在聲明的時候初始化或者在static靜態塊裡面初始話。
所以你要用程式輸入作為他的變數,就必須修改變數類型
你可以寫成
public class xx
{
public final String PackageName ;
public xx(String name)
{
PackageName = name;
}
}
在外面定義一個xx的靜態執行個體 public static xx xxInstance = new xx("輸入的值");
調用的時候,就寫xxInstance.PackageName
從來只有成員變數和局部變數的區別。
我們就好比一個類是一個公司,
成員變數就是這個公司的正式員工,一直存在,與公司同生同滅..
而局部變數就是臨時工,公司請臨時工來做一點事情,做完,臨時工就沒有了,被銷毀了!(好靈異)
確實有人把成員變數叫成全域變數.那是以這個類作為全部
其實還有一種比成員變數更大的...可能你不懂,不過以後你就知道了.
我建一個公用類,我在裡面聲明一個靜態變數,那麼,我在任何地方都可以用它了..它也被通俗的叫做<全域變數>
類:具有同種屬性的對象稱為類,是個抽象的概念。比如說:汽車、人、狗、神;
對象:日常生活中的所有東西都是對象,是類的執行個體化。比如說:推土車是汽車的執行個體化;姚明是人的執行個體化;小白(狗的名字)是狗的執行個體化;二郎神是神的執行個體化;
屬性:用來描述具體某個對象的特徵的是屬性,是靜態。比如:姚明身高2.6米多;小白的毛髮是棕色的;二郎神額頭上有隻眼睛;
方法:每個對象有它們自己的行為或者是使用它們的方法,比如說一隻狗會跑會叫等,我們把這些行為稱之為方法,是動態,可以使用這些方法來操作一個對象;
類的成員:屬性和方法稱為這個對象的成員,因為它們是構成一個對象的主要部分,沒有了這兩樣東西,那麼對象也沒什麼存在意義了。
- 以上是本人在翻完 PDF 後的個人筆記和理解以及見解,不見得百分百對,以下附上本人測試範例程式碼,會更有說服性
範例程式碼
1
2/**
3 * -----------------------------------------
4 * @檔案: Statical.java
5 * @作者: fancy
6 * @郵箱: [email protected]
7 * @時間: 2012-7-9
8 * @描述: TEST
9 * -----------------------------------------
10 */
11public class Statical {
12
13 /**
14 * 靜態代碼塊
15 * 類變數(靜態變數)可以向前引用(即:先引用,再定義)
16 */
17 static {
18 name = "fancydeepin"; // name 的定義在使用之後
19 System.out.println("---> 靜態代碼塊被執行 <---");
20 }
21 /**
22 * 類變數(靜態變數)在類的初始化之前初始化,無論類的執行個體將被建立多少個
23 * 類變數(靜態變數)都將只在初始化時候在棧記憶體上分配一次空間
24 * 凡 static 修飾的,都將按位置被順序執行,所以,
25 * name 的值最終輸出 fancy 而不是上面的 fancydeepin
26 */
27 public static String name = "fancy"; //類變數(靜態變數)
28 private String mail = "myEmail"; //執行個體變數(非靜態變數),定義時指定初始值,會比在構造器賦予值更早執行
29
30 public Statical() {
31 mail = "[email protected]";
32 System.out.println("---> 構造器代碼塊被執行 <---");
33 }
34 /**
35 * 非靜態代碼塊
36 * 實際上,非靜態代碼塊在類初始化建立執行個體時,將會被提取到類的構造器中,
37 * 但是,非靜態代碼塊會比構造器中的代碼塊優先被執行
38 * 所以,mail 最終輸出的是類構造器中給定的值,也就是 [email protected]
39 * 而不是 [email protected],更不是 myEmail
40 */
41 {
42 mail = "[email protected]";
43 System.out.println("---> 非靜態代碼塊被執行 <---");
44 }
45
46 // getting and setting
47
java 成員變數、局部變數、靜態變數、類變數、非靜態變數、執行個體變數、向前引用、非法向前引用、靜態代碼塊、非靜態代碼塊