Java面向對象(2) —— 內存管理、繼承

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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章