Java面向对象(2)
来源:互联网 发布:电子科大软件工程学院 编辑:程序博客网 时间:2024/06/11 20:14
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); }}
- java--面向对象(2)
- java面向对象(2)
- Java面向对象(2)
- Java面向对象(2)
- java面向对象2
- java面向对象2
- java--面向对象2
- java面向对象2
- 2、Java面向对象
- java 面向对象2
- JAVA面向对象2
- JAVA面向对象2
- Java面向对象2
- Java面向对象(2)
- JavaSE(2):java面向对象(上)
- 黑马程序员--面向对象2(Java)
- Java基础知识之面向对象(2)
- "黑马程序员"Java面向对象(2)
- iOS 企业签名 ipa 包要求
- 模板方法模式深度解析(一)
- C语言发展史
- java环境变量的配置
- ESET NOD32 v11.0.154
- Java面向对象(2)
- 策略模式
- 第9章--模板
- python爬虫基础知识(二)--正则表达式
- 442. Find All Duplicates in an Array(C++)
- 什么时候使用assert
- CSS3(十八)
- Java中Lambda表达式的使用
- XAMPP设置MySql服务器用户名密码及远程访问权限