本篇是java的開篇之做。java
下面是引用蔡學鏞的一篇文章數組
根據聲明方式來爲變量分類
根據聲明方式詳細來區分,Java的變量有七種,下面的程序代碼展現了這七種變量的聲明方式:
Class Myclass {
static int a;
int b;
public static void myMethod(int c) {
try {
int d;
} catch(Exception e) {
}
}
MyClass(int f) {
int[]g = new int[100];
}
}
class variable:聲明在class內,method以外,且使用static修飾的變量,例如上面程序代碼的a.
instance variable:聲明在class內,method以外,且未使用static修飾的變量,例如上面程序的b.
method parameter:聲明在method小括號內的變量,例如上面程序代碼的c.
狹義的局部變量(local variable):聲明在method內的變量,例如上面程序代碼的d和g.
exception-handler parameter:聲明在catch小括號內的變量,例如上面程序代碼的e.
constructor parameter:聲明在constructor小括號內的變量,例如上面程序代碼的f.
數組元素(array element):數組的元素值沒有識別名稱,必須透過數組和索引值(index)來識別.例如上面
程序代碼的g[0].
根據變量內存來分類
根據變量內存位置來區分,Java的變量有兩種,包括了:
heap variable:佔用的內存在heap中,這類變量包括了class variable,instance variable,array component,
即前面程序的a,b,g[0].這類變量會自動被JVM初始化默認值.
stack variable:一般廣義的局部變量(pan-local variable),其佔的內存在stack中,這類變量包括了狹義的
局部變量,method parameter,exception-handler parameter,constructor parameter,即前面程序 的c,d,e,f.狹義 的局部變量不會被JVM初始化成默認值,使用者必須自行初始化該變量,可是parameter類(包括method parameter,exception-handler parameter,constructor parameter)會被JVM初始化成傳入值.
根據使用方式來爲變量分類
根據使用方式,只要分三類便可,分別是:
class variable:即上例的a.
instance variable:即上例的b.
廣義的局部變量:包含上例的c,d,e,f.這四者的差異很小,直接歸爲一類.
至 於"數組元素"(array component)則不在此三類中,可是"數組元素"並不常被注意到,爲它多分出一類的用處不大.我一般將數組視爲對象,將array component視爲對象的instance variable. <蔡學鏞>ide
下面是<<thinking in java>>裏關於變量概念的介紹:google
變量分爲:primitive type和reference type.指針
primitive type是存儲在堆棧裏,reference type存儲在堆裏component
看到這裏,你可能開始有疑問了,這明明就是矛盾的嘛,蔡文章裏面提到的a是int類型的,它卻在堆裏。用google查了一下,發現說什麼的都有,到底誰說的纔是正理呢?下面就來重點討論一下java裏面各類類型在內存裏面的存儲狀況。對象
首先須要明確的是:基本類型直接存儲了實際的數值;應用類型例如(String a),a實際上是一個引用,它存儲的是指向實際內容的一個指針(實際內容開頭的物理地址)索引