1.寄存器(register).位于CPU中,所以它是存取速度最快的存儲區.但是由于CPU中寄存器的數量是非常有限的,所以寄存器的使用是由CPU按需進行分配.編程的時候我們沒有必要去對它進行直接控制.并且在程序中也沒辦法找到到底什么時候使用了寄存器的依據.
2.棧(stack).它位于隨機存取存儲器(RAM)中,并通過由CPU直接支持的棧指針(stack pointer)來進行操作.棧指針通過向下移動來分配新的存儲空間,并通過向上移動來釋放存儲空間.這是僅次于寄存器的另一種高速有效地分配存儲空間的方式.在創建程序期間,Java編譯器必須知道存儲在棧上的所有數據的準確大小和它們的生命周期.這樣它才能夠產生代碼來讓棧指針上下地移動.但這種約束限制了代碼的靈活性,所以當某些Java存儲區在棧上的時候——特別是,對象引用
(object reference)――而Java對象本身并不被存儲在棧上.
3.堆(heap).這是存儲Java所有對象的內存池(同樣在RAM區域中).堆的優點是,它不像棧一樣,編譯器并不需要知道它應該從堆中分配多大的存儲空間,或者存儲空間應該在堆上存在多久.因此,在堆上分配多大的存儲空間具有很大的靈活性.無論你何時需要創建對象,你只需要簡單的在代碼中使用關鍵字 new來創建它就行了.在這段代碼被執行時候就在堆(heap)上面分配相應的存儲空間.當然,為這樣的靈活性也需要付出一定的代價:在堆上分配存儲空間比在棧上分配存儲空間要更加耗時(如果你能夠在Java中像在C++一樣,在stack上創建對象的話).
4.靜態存儲區(static storage).”靜態(static)”在這里表示”在一個固定的位置”(盡管它同樣在RAM中).靜態存儲區包括:對于程序的整個運行期間都有效的 數據.你能夠使用關鍵字static來指定特殊的對象為靜態的.但是Java對象自身卻從來不放置在靜態存儲區中.
5.常量存儲區(constant storage).常量通常被直接放置在程序代碼當中.這是安全的。
基本類型存放在堆棧中,每種基本類型所占存儲空間的大小都是確定的。基本類型具有包裝器類,可以在堆中創建一個非基本對象,用來表示對應的基本類型。
基本成員默認值
若類的某個成員是基本數據類型,即使沒有進行初始化,Java也會確保它獲得一個默認值。如下表所示:
基本類型 默認值
boolean
false
char
‘\u0000’ (null)
byte
(byte)0
short
(short)0
int
0
long
0L
float
0.0f
double
0.0d
然而上述確保初始化的方法并不適用于“局部”變量(即并非是某個類的屬性)。因此,如果在某個方法中有這樣定義:
int x;
那么變量x得到的可能是任意值,而不會被自動初始化為零。
Static的數據和方法不會與包含它的類的任何對象實例關聯在一起。非static數據和方法必須知道它們一起運作的特定對象。
通常一個普通類不允許聲明為靜態的,只有一個內部類才可以。這時這個聲明為靜態的內部類可以直接作為一個普通類來使用,而不需實例一個外部類。
Java中,類構造器由編譯器調用,無返回值。如果沒有寫構造器,編譯器會自動創建一個構造器,如果寫了構造器,編譯器就不會自動創建缺省構造器。
this編譯器把所操作對象的引用作為第一個參數傳遞給成員函數。在方法內部獲得當前對象的引用。this關鍵字只能在方法內部使用,表示對調用方法的那個對象的引用。
static方法就是沒有this的方法。在static方法內部不能調用非靜態方法,反過來卻可以。
“this通常指代當前對象,super通常指代父類”。當你想要引用當前對象的某種東西,比如當前對象的某個方法,或當前對象的某個成員,你便可以利用this 來實現這個目的,當然,this的另一個用途是調用當前對象的另一個構造函數。如果你想引用父類的某種東西,則super。
最普遍的情況就是,在你的方法中的某個形參名與當前對象的某個成員有相同的名字,這時為了不至于混淆,你便需要明確使用this關鍵字來指明你要使用某個成員,使用方法是“this.成員名”,而不帶this的那個便是形參。另外,還可以用“this.方法名”來引用當前對象的某個方法,但這時this就不是必須的了,你可以直接用方法名來訪問那個方法,編譯器會知道你要調用的是那一個。
在構造函數中,this和super不再是像以前那樣用“.”連接一個方法或成員,而是直接在其后跟上適當的參數,因此它的意義也就有了變化。在構造器中,this只能調用一個構造器,且必須將構造器調用置于最起始處。super后加參數的是用來調用父類中具有相同形式的構造函數。this后加參數則調用的是當前具有相同參數的構造函數。
final成員:當你在類中定義變量時,在其前面加上final關鍵字,那便是說,這個變量一旦被初始化便不可改變,這里不可改變的意思對基本類型來說是其值不可變,而對 于對象變量來說其引用不可再變。其初始化可以在兩個地方,一是其定義處,也就是說在final變量定義時直接給其賦值,二是在構造函數中。這兩個地方只能 選其一,要么在定義時給值,要么在構造函數中給值,不能同時既在定義時給了值,又在構造函數中給另外的值。
如果不加訪問權限,則默認為包訪問權限,即包內的類對其有訪問權限。
protected:繼承訪問權限。基類通過protected把訪問權限賦予派生類而不是所有類,
另外,protected也提供包訪問權限,也就是說,相同包內的其他類可以訪問protected元素。
對于類訪問權限來說,
僅有兩個選擇:包訪問權限或public。
類既不可以是private的,也不可以是protected的,但內部類是個特例,一個內部類可以是private或protected的。