Java物件的記憶體分配及初始化

2021-08-26 05:46:08 字數 1071 閱讀 5972

public

class square

}public

class testsquare

}

1.程式開始執行時,testsquare被類載入器載入進入記憶體,main方法由於是static方法首先pop到棧中;

2.接著就是new square(),類載入器載入square類,對類中的成員變數和方法進行初始化;

3.在棧中分配記憶體給物件的引用s,在堆中對square類進行預設構造器的初始化,得到其儲存位址賦值給引用s

4.引用s在呼叫getarea()方法時,通過隱藏的this指標,找到堆記憶體位址,返回area值;

了解了這個以後,我們去看 == 和 equals 的區別更加明白了

1. == 對於物件而言,比較的是棧記憶體中的存放的物件位址,用來判斷兩個物件的位址是否相同,而對於基本型別來說,由於其存放的就是其內容,所以只要值相等就可以;

2. equals 比較的是兩個物件的值是否相等,而不是實體地址,但是在object方法中的equals一般都需要自己重寫一下才能起到這個作用;

原始碼如下:

public

boolean

equals(object obj)

在string,integer等包裝類中對其進行了重寫,但是自己重寫的時候依舊需要注意以下幾點:

1. 自反性:對任意引用值x,x.equals(x)的返回值一定為true;

2. 對稱性:對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true;

3. 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true ;

4. 一致性:如果參與比較的物件沒任何改變,則物件比較的結果也不應該有任何改變;

5. 非空性:任何非空的引用值x,x.equals(null)的返回值一定為false 。

物件記憶體空間分配與初始化

在c 中,乙個變數可以在某個程式範圍內的任何地方定義,所以在這個變數的定義之前是無法對它分配記憶體空間的。通常,c 編譯器可能像c編譯器一樣,在乙個程式塊的開頭 就分配所有的記憶體。這些對我們來說是無關緊要的,因為作為 乙個程式設計師,我們在變數定義之前總是無法得到儲存空間的。即使儲存空間在塊的一開...

C語言中的初始化及記憶體分配

很多字串在用 strcpy 拷貝時會報錯或者直接賦值時會出現亂碼,都是因為沒有初始化。char str char malloc sizeof char memset str,0,sizeof char 即可 有時在編譯時並不知道陣列的長度,可以這樣動態分配陣列 乙個自定義結構體的初始化 mystuc...

objective c 分配和初始化物件

和c 類似oc中也有乙個根型別,也就是nsobject,它包含乙個alloc方法和乙個init方法。顧名思義,alloc用於申請記憶體,建立乙個物件的內部結構,並且將例項變數賦值為0。init方法賦值將變數的值賦值為預設值 似乎和0不一樣 然後執行一些其它的任務。alloc就像進入了一輛車裡,而in...