Java OOP day03

笔记:
一.内存管理:由JVM来管理————————————-了解
1)堆:
1.1)存储所有new出来的对象(包括成员变量)
1.2)垃圾:没有任何引用所指向的对象
垃圾回收器(GC)不定时到内存中清理垃圾
回收过程是透明(看不到)的,不一定一发现垃圾就立刻回收
调用System.gc()建议虚拟机尽快调度GC来回收垃圾
1.3)成员变量的生命周期:
创建对象时存在堆中,对象被回收时一并消失
1.4)内存泄漏:不再使用的内存没有被及时的回收
建议:对象不再使用时及时将引用设置为null
2)栈:
2.1)存储正在调用方法中的所有局部变量(包括参数)
2.2)调用方法时,在栈中为该方法分配一块对应的栈帧,
栈帧中存储方法中所有的局部变量(包括参数),
方法调用完成后,栈帧被清除,局部变量一并消失
2.3)局部变量的生命周期:
调用方法中存在栈帧中,方法调用结束时与栈帧一并消失
3)方法区:
3.1)存储.class字节码文件(包括方法)
3.2)方法只有一份,通过this来区分具体的对象

二.继承(泛化):—————————————————–重点
1)实现代码的复用
2)通过extends来实现继承
3)父类/基类:所有子类共有的属性和行为
子类/派生类:子类所特有的属性的行为
4)子继承父后,子具有:子+父
5)一个父类可以有多个子类
一个子类只能有一个父类—-单一继承
6)继承有传递性
7)java规定:构造子类之前必须先构造父类
在子类构造方法中若没有调用父类构造,
则默认super()调用父类的无参构造。
若在子类构造方法中调用父类构造了,
则不再默认提供
super()调用父类构造必须位于子类构造的第一句(调用构造方法只能在构造方法中,不能放普通方法中,如果父类中有有参的构造,那么子类继承时必须要写个构造方法去super(参数)它,而且必须放第一位。)
8).super:指代当前对象的父类对象
super的用法:
1)super.成员变量名———-访问父类的成员变量
2)super.方法名()————调用父类的方法
3)super()——————-调用父类的构造方法

三.向上造型:
1)父类型的引用指向子类的对象
2)能点出来什么,看引用的类型

练习:用继承继续完成构建Tetromino类,重构T和J类并测试,实现打墙+打图形。

HW:
1.JVM如何管理内存,分成几个部分?分别有什么用途?说出下面代码的内存实现原理:
Foo foo = new Foo();
foo.f();

答:JVM内存分为“堆”、“栈”和“方法区”三个区域,分别用于存储不同的数据。
堆内存用于存储使用new关键字所创建的对象;栈内存用于存储程序运行时在方法中声明的所有的局部变量;方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。类的各种信息(包括方法)都在方法区存储。
以上代码的内存实现原理为:
1).Foo类首先被装载到JVM的方法区,其中包括类的信息,包括方法和构造等。
2).在栈内存中分配引用变量foo。
3).在堆内存中按照Foo类型信息分配实例变量内存空间;然后,将栈中引用foo指向foo对象堆内存的首地址。
4).在方法区中使用引用foo调用方法,根据foo引用的类型Foo调用f方法。

2.练习题
package Test;
/**一、设计数据结构:
* 1.分析俄罗斯方块,最小个体对象为格子,建个格子类Cell,包含格子的属性和行为,属性:图片,行列坐标,方法下落左右移动,以及坐标信息。
* 2.分析游戏中第二对象,也是直接操控的对象,有TJLIOSZ七大形状的格子,分别建立七个类,包含每种形状的属性和行为。但由于属性在Cell类中
* 包含了,没必要重复。而行为四个格子组的形状一起的行为Cell里的单个格子方法不再满足,所以Cell中的方法可以删掉,用此处的方法。
* 3.考虑到七个类型的格子和避免代码的重复以及拓展性,用到继承父类以及向上造型来完成它,就是找出他们的共性放入父类Tetromino内
* 二、设计程序结构:方法。先建格子运动,再建格子运动所需的背景。
* 三、具体算法。要求掌握boolean开关的用法*/

1).
public class Cell {

int row,col;
Cell(int r,int c){
    this.row=r;
    col=c;
}   
String GetCellInfo(){
            return row+","+col;
}

}
2).
public class T extends Tetromino{
/*T(){
//super();此处因为this调用的方法内默认有个父类的super();如果再写就两次了,会报错
//super和this用法类似,指当前对象的父类对象,默认存在,调用父类的无参构造,java规定构造子类之前必须先构造父类
this(1,2);
}*/
T(int r,int c){
cells[0]=new Cell(r,c);
cells[1]=new Cell(r,c+1);
cells[2]=new Cell(r,c+2);
cells[3]=new Cell(r+1,c+1);
}
}

public class J extends Tetromino{
/*J(){
this(1,1);
}*/
J(int r,int c){
cells[0]=new Cell(r,c);
cells[1]=new Cell(r,c+1);
cells[2]=new Cell(r,c+2);
cells[3]=new Cell(r+1,c+2);
}
}

3).
public 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++;
}
}
void Print(){
    for(int i=0;i<cells.length;i++){
        String str=cells[i].GetCellInfo();
        System.out.println(str);
}
}  }



4).
public class TJTest {
  public static void main(String[] args) {
    Tetromino t=new T(2,2);             //向上造型,父类的引用指向子类的对象
    Tetromino j=new J(1,1);
    PrintWall(t);                       //先造型 后传值
    System.out.println("T开始运动");
    t.Drop();
    t.MoveLeft();
    t.MoveRight();
    PrintWall(t);
    System.out.println("L开始运动");
    j.Drop();
    j.MoveLeft();
    j.MoveRight();
    PrintWall(j);

}

public static void PrintWall(Tetromino tt){
    for(int r=0;r<20;r++){
        for(int c=0;c<10;c++){

            boolean bn=false;             // 1.假设为false时打“-”
            for(int i=0;i<tt.cells.length;i++){
                if(r==tt.cells[i].row&&c==tt.cells[i].col){// 行和列的表现形式,因为要或四次,用for循环
                    bn=true;             //2.修改为打*
                    break;              // 和两个数组同位置上元素道理相同
                }
            }
            if(bn){
                System.out.print("* ");
            }else{
                System.out.print("- ");// 现在只和1个格子配,但我们需要和四个格子配,用个boolean开关
            }

        }
        System.out.println();
    }
}}

3.熟练掌握知识点,不要掉队,跟上步伐。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值