1. 程式人生 > >Java_記憶體管理和繼承

Java_記憶體管理和繼承

Java 記憶體管理

例項

public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//JVM(java virtual machine) Java虛擬機器(跨平臺) android手機(linux)
//JVM主要是解析.class檔案的
Cell cell=new Cell();
System.out.println("cell="+cell);
int num=5;
/*
* 區域性變數存在棧記憶體中
* 成員變數存在堆記憶體中
*/
/*
* 成員變數的生命週期:
* 從物件在堆中建立開始到物件從堆中回收結束
* 物件被回收:
* 當物件沒有任何引用指向時,被視為廢棄的物件,屬於被回收的資料,該物件中的所有成員變數也隨之被回收
*/
Cell cell1=new Cell();//row=0,col=0;
cell1=null;
//java回收機制
/*
*GC(garbage Collection)垃圾回收器
*用於回收沒有任何引用指向的物件
*/
//out of memory(記憶體溢位)
System.gc();//主動回收沒有任何引用指向的物件(也是隨機的)

/*
* 區域性變數(引數變數)的生命週期
* 從方法的呼叫開始到方法的呼叫結束
*/
go(3);
}
public static void go(int b){
int a=4;
System.out.println("a="+a);
}


}

Java 繼承


繼承的概念

繼承是java面向物件程式設計技術的一塊基石,因為它允許建立分等級層次的類。

繼承就是子類繼承父類的特徵和行為,使得子類物件(例項)具有父類的例項域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。

生活中的繼承:

兔子和羊屬於食草動物類,獅子和豹屬於食肉動物類。

食草動物和食肉動物又是屬於動物類。

所以繼承需要符合的關係是:is-a,父類更通用,子類更具體。

雖然食草動物和食肉動物都是屬於動物,但是兩者的屬性和行為上有差別,所以子類會具有父類的一般特性也會具有自身的特性。

類的繼承格式

在 Java 中通過 extends 關鍵字可以申明一個類是從另外一個類繼承而來的,一般形式如下:

類的繼承格式

class 父類 { } class 子類 extends 父類 { }

為什麼需要繼承

接下來我們通過例項來說明這個需求。

開發動物類,其中動物分別為貓以及狗

公共父類動物類:

public class Animals{
String gender;
int age;
public Animals() {
super();
}
public Animals(String gender,int age){
this.gender=gender;
this.age=age;
}
public void eat(){
System.out.println("動物的食性");
}
public void breed(){
System.out.println("動物的繁殖");
}
public void act(){
System.out.println("動物的行為");
}
}

貓類:

public class Cats extends Animals{
// String gender;
// int age;
//
// public void eat(){
// System.out.println("動物的食性");
// }
// public void breed(){
// System.out.println("動物的繁殖");
// }
String color;
String kind;
public Cats(){
super();//預設呼叫父類無參的構造方法
}
public void catchMouse(){
System.out.println("貓抓老鼠");
}
public void eatFish(){
System.out.println("貓吃魚");
}
public static void main(String[] args) {
Cats cat=new Cats();


}


}

狗類:

/*
 * extends繼承
 * 繼承滿足is a的關係
 * Dog is a Animal.
 * Animals稱為superClass(父類)
 * Dogs稱為SubClass(子類)
 * 子類繼承父類主要繼承父類的屬性和方法(構造方法除外)
 * 
 */
public class Dogs extends Animals {
// String gender;
// int age;
// public void eat(){
// System.out.println("動物的食性");
// }
// public void breed(){
// System.out.println("動物的繁殖");
// }
String color="黃";//顏色
String kind;//品種
//在子類的構造方法裡呼叫父類的構造方法
public Dogs() {
super("雌",20);//super()呼叫父類無參的構造方法,只能寫在第一行
}
public void lookDoor(){
System.out.println("看門");
}
public void bark(){
System.out.println("吠叫");
}
//方法的重寫:子類的方法和父類的方法一樣(方法名和引數列表一樣)  overRide
public void act(){
super.act();//在子類重寫的方法裡呼叫父類的方法
System.out.println("Dog可以跑");
}
public static void main(String[] args) {
//編譯的時候看引用前面的型別,執行時看物件型別
Dogs dog=new Dogs();
dog.age=5;
// dog.kind="金毛";
// dog.breed();
// dog.bark();
String s=dog.color;
dog.act();
}

父類Tetromino類

//俄羅斯方塊的父類
public class Tetromino {
//定義公有的屬性
Cell[] cells;
public Tetromino(){
cells=new Cell[4];//初始化四個格子
}
//列印四個格子的座標
public void print(){
String str="";
for(int i=0;i<cells.length-1;i++){
str=str+"("+cells[i].getCellInfo()+"),";
}
str=str+"("+cells[cells.length-1].getCellInfo()+")";
System.out.println(str);
}
//四個格子都得下落一行
public void drop(){
for(int i=0;i<cells.length;i++){
cells[i].row++;//給每一個格子的行加一
}
}
//四個格子都得左移一列
public void moveLeft(){
for(int i=0;i<cells.length;i++){
cells[i].col--;//給每一個格子列減一
}
}
//四個格子都得右移一列
public void moveRight(){
for(int i=0;i<cells.length;i++){
cells[i].col++;//給每一個格子列加一
}
}
}

子類TetrominoT類

//子類繼承父類的屬性和方法(不包括構造方法)
public class TetrominoT extends Tetromino{
//Cell[] cells;
public TetrominoT(int row,int col){
super();//呼叫父類無參的構造方法,對cells進行初始化
//對數組裡面元素初始化
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);
}
//在子類的方法裡呼叫父類裡面的方法
public void print(){
System.out.println("i am a T");
super.print();
}
}

TetrominoGame測試類

public class TetrominoGame {
public static void main(String[] args) {
//測試TetrominoT
System.out.println("------列印T------");
TetrominoT t=new TetrominoT(1, 1);//向上造型
//編譯期看引用前的的型別,執行看引用指向的物件型別
t.print();
printTetromino(t);
System.out.println("------T下落一行------");
t.drop();
t.print();
printTetromino(t);

System.out.println("-------列印L-------");
Tetromino l=new TetrominoL(4,4);
l.print();
printTetromino(l);


}
//列印四格方塊    //Tetromino tetromino=new TetrominoL(4,4)
public static void printTetromino(Tetromino tetromino){//Tetromino tetromino=new TetrominoT(1, 1)
int totalRow=20;
int totalCol=10;
//獲取方塊儲存的四格格子的陣列
Cell[] cells=tetromino.cells;
//外層兩個迴圈表示場地的每一個點
for(int row=1;row<=totalRow;row++){//表示行
for(int col=1;col<=totalCol;col++){//表示列
boolean isInCells=true;//預設輸出-
for(int i=0;i<cells.length;i++){
if(cells[i].row==row&&cells[i].col==col){
System.out.print("*");
isInCells=false;//輸出*
break;
}
}
if(isInCells){
System.out.print("-");
}

}
System.out.println();
}
}


}