1、對象內存管理
編譯好的Java程序運行在JVM中,JVM爲Java提供並管理所需要的內存空間。JVM內存分爲“堆”、“棧”和“方法區”三個區域,分別用於存儲不同的數據。
1.1、堆
(1)、用於存儲所有new出來的對象(包括成員變量)。
(2)、成員變量的生命週期
創建(new)對象時存在堆中,對象被垃圾回收器回收時一併消失。
(3)、垃圾回收器(GC)
垃圾回收器(Garbage Collection,GC)是JVM自帶的一個線程(自動運行着的程序),用於回收沒有任何引用指向的對象。
GC線程並不一定一發現無引用的對象,就立刻回收。一般情況下,當我們需要GC線程即刻回收無用對象時,可以調用System.gc()方法。System.gc()用於建議JVM馬上調度GC線程回收資源,具體的實現策略取決於不同的JVM系統。
(4)、內存泄漏
不再使用的對象沒有被及時的回收。建議一般當對象不再使用時應及時將引用設置爲null。
1.2、棧
(1)、用於存儲正在調用中的方法的所有局部變量。注意這裏的局部變量沒有默認值,必須自行設定初始值。
(2)、調用方法時,在棧中爲該方法分配一塊對應的棧幀。棧幀中包含所有的局部變量(包括參數),方法調用結束時,棧幀消失 ,局部變量一併消失。
(3)、局部變量的生命週期
調用方法時存在棧中,方法調用結束時與棧幀一併失效。
1.3、方法區
(1)、Java程序運行時,首先會通過類裝載器載入類文件的字節碼信息(包括方法),經過解析後將其裝入方法區。
(2)、方法只有一份,所有的實例對象共用在方法區中的這一份方法定義,通過this來區分具體的引用。
2、繼承
2.1、繼承的實現與特性
通過extends關鍵字可以實現類的繼承。
子類(sub class)可以繼承父類(super class)的成員變量和成員方法,繼承具有傳遞性,同時也可以定義自己的成員變量和成員方法。
Java語言不支持多重繼承,一個類只能繼承一個父類,但一個類可以有多個子類。
2.2、super關鍵字
子類的構造方法中必須通過super關鍵字調用父類的構造方法,這樣可以妥善的初始化繼承自父類的成員變量。
如果子類的構造方法中沒有調用父類的構造方法,Java編譯器會自動的加入對父類無參構造方法的調用(如果該父類沒有無參的構造方法,會有編譯錯誤)。
3、向上造型
一個子類的對象可以向上造型爲父類的類型。即,定義父類型的引用可以指向子類的對象。
父類的引用可以指向子類的對象,但通過父類的引用只能訪問父類所定義的成員,不能訪問子類擴展的部分。
package xxx;
public class TetrominoTest {
public static void main(String[] args) {
Tetromino t = new T(0,0); //向上轉型
printTetromino(t);
Tetromino j = new J(5,4);
printTetromino(j);//先造型再傳值
T t1 = new T(4,3);
printTetromino(t1);//傳值同時造型
//Tetromino tt = new T(4,3)
}
//向上轉型:讓子類公用一種類型---父類型
public static void printTetromino(Tetromino tt) { // 打牆+格
Cell[] cells = tt.cells;
for (int i = 0; i < 20; i++) { // 行
for (int j = 0; j < 10; j++) { // 列
boolean flag = true;
for (int k = 0; k < 4; k++) {
if (i == cells[k].row && j == cells[k].col) {
System.out.print("* ");
flag = false;
break;
}
}
if (flag) {
System.out.print("- ");
}
}
System.out.println();
}
}
}
class Tetromino { // 父類--圖形類
Cell[] cells;
Tetromino() {
cells = new Cell[4];
}
void drop() { // 下落
for (int i = 0; i < cells.length; i++) {
cells[i].row++;
}
}
void moveLeft() { // 左移
for (int i = 0; i < cells.length; i++) {
cells[i].col--;
}
}
void moveRight() { // 右移
for (int i = 0; i < cells.length; i++) {
cells[i].col++;
}
}
}
class T extends Tetromino {
T() {
this(0, 0); // 調本類構造方法
}
T(int row, int col) {
super(); // 自己不寫則默認添加
// 調父類的構造方法
cells[0] = new Cell(row, col);
cells[1] = new Cell(row, col + 1);
cells[2] = new Cell(row, col + 2);
cells[3] = new Cell(row + 1, col + 1);
}
}
class J extends Tetromino {
J() {
this(0, 0);
}
J(int row, int col) {
cells[0] = new Cell(row, col);
cells[1] = new Cell(row, col + 1);
cells[2] = new Cell(row, col + 2);
cells[3] = new Cell(row + 1, col + 2);
}
}