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();
}
}


}

猜你喜欢

转载自blog.csdn.net/Anthonybuer/article/details/69666693
今日推荐