面向物件--引用型別資料及物件記憶體管理
阿新 • • 發佈:2022-03-19
三、陣列
1、引用型別陣列:
1.1 陣列是物件
- 陣列是引用資料型別;
- 陣列物件在堆中建立,宣告的變數是引用型別,引用儲存的是陣列物件的地址值,指向陣列物件;
- 可以將陣列中的元素看成物件的成員變數,只不過型別完全一致而已。
1.2 引用型別陣列的宣告
- 陣列的元素可以為任意型別,當然也可以為引用型別;
- 引用型別陣列元素儲存的不是物件本身,而是儲存元素物件的引用。
public class Cell { int row; int col; public Cell(int col,int row) { this.col = col;this.row = row; } } public class TestCell { public static void main(String[] args) { Cell[] cells = new Cell[3];// cells[0] = new Cell(1,2); cells[1] = new Cell(1,2); cells[2] = new Cell(1,2); System.out.println(Arrays.toString(cells)); } }
1.3 陣列的初始化(重點)
- 陣列元素的預設值為null;
- 如果希望每個元素都指向具體的物件,則需要對每個元素都使用new建立例項。
1.4 陣列的元素是基本型別陣列
- 陣列的元素可以為任意型別,當然也可以為基本型別陣列--二維陣列
public class Cell { int row; int col; public Cell(int col,int row) { this.col = col; this.row = row; } } public class TestCell { public static voidmain(String[] args) { Cell[] cells = new Cell[3];// cells[0] = new Cell(1,2); cells[1] = new Cell(1,2); cells[2] = new Cell(1,2); System.out.println(Arrays.toString(cells)); } }
四、物件記憶體管理(重點)
1、堆記憶體
1.1 物件儲存在堆中
- JVM分為三個區域:堆(heap)、棧(stack)、方法區(method);
- JVM為java程式提供並管理所需要的記憶體空間;
- 堆中儲存使用new關鍵字建立的物件---陣列、String、Person等。
1.2 成員變數的生命週期
- 當一個引用值為null時,該物件沒有任何引用指向,則該物件被設為廢棄物件,屬於被回收範圍;
- 成員變數的生命週期:從物件在堆中建立,到物件從堆中被回收為止;
1.3 垃圾回收機制
- 垃圾回收器(Garbage Collection ,GC),是JVM自帶的一個執行緒(自動執行的),用於回收沒有任何引用指向的物件;
- 垃圾回收器會自動幫java程式設計師處理垃圾。
1.4 記憶體洩漏
- 記憶體洩漏:不再使用的物件沒有被及時回收,積攢過多導致程式崩潰。
1.5
-
- 這個方法強制排程GC執行緒回收無用物件。
2、棧
2.1 棧存放方法中的區域性變數
2.2 區域性變數的生命週期
- 宣告週期:棧幀被建立開始--方法執行完畢棧幀被銷燬結束,區域性變數也隨之銷燬;
- 棧幀中儲存的是:區域性變數和引數等。
2.3 區域性變數和成員變數的區別:
成員變數:
- 定義在類外,方法外;
- 有預設初始值,可以不顯式初始化;
- 所在類被例項化之後,存在堆中,物件被回收時,成員變數失效;
區域性變數:
- 定義在方法外;
- 沒有預設值,必須自行設定初始值;
- 方法被呼叫時,存在棧中,方法呼叫結束,從棧中清除。
3、方法區
3.1 存放類的資訊
- java在執行時,會通過類載入器載入類檔案的位元組碼資訊,解析後放在方法區中。
3.2 方法只有一份
- 當類的資訊載入到方法區時,類中的類方法也被載入在方法區中;
- 無論建立多少物件,所有的物件是公用方法區中一個方法的定義。