1.内存管理
1.1堆
- 用于存储所有new出来的对象(包括成员变量)
- 成员变量的生命周期
创建对象时存在堆中,对象被GC回收时一并消失 - 垃圾回收器(GC)不定时到对堆中查看看到垃圾自动回收
垃圾:没有任何引用指向的对象
回收过程是透明的,并不是一看到垃圾就马上回收
若想让它快一些收,可以调用System.gc() - 内存泄露:不再使用的对象没有被及时回收
建议,当对象不再使用时应及时将引用设置为null
对象存储在堆中
-
jvm在其内存空间中开辟了一个称为“堆”的存储空间;
-
这部分空间用于存储使用new关键字所创建的对象
成员变量的生命周期
- 访问对象需要依靠引用变量
- 当一个对象没有任何引用时,被视为废弃的对象,属于被回收的范围。该对象的所有成员变量也随之被回收
- 成员变量的生命周期为:从对象在堆中创建开始到对象从堆中被回收结束
Cell C = new Cell();
c = null;
//不再指向刚分配的对象空间,成员变量失效
1.2栈
- 用于存储正在调用中的方法的所有局部变量(包括参数)
- 调用方法时在栈中为该方法分配一块对应的栈帧,栈帧中包含所有的局部变量(包括参数)方法调用结束时,栈帧消失,局部变量一并消失
- 局部变量的生命周期:
调用方法时存在栈中,方法调用结束时与栈帧一并消失
1.3方法区
- 用于存储.class字节码文件(包括方法)
- 方法只有一份,通过this来区分到底是哪个引用
2.继承
-
目的:避免代码重复,有利于代码的重用
-
通过extends实现继承
-
父类:所有子类所共有的属性和行为
子类:子类所特有的属性和行为 -
子类继承父类后,子类具有:子类+父类
-
一个父类可以有多个子类
一个子类只能有一个父类----单一继承 -
继承具有传递性
-
JAVA规定:构造子类之前必须先构造父类,子类构造中没有调用父类的构造方法,则默认super() 来调用父类的无参构造,若自己调了,则不再默认提供。super调用父类构造,必须位于子类构造的第一句
-
泛化的过程
3.super:指代当前对象的父类对象
- super.成员变量名------访问父类的成员变量
- super.方法名()----------调用父类的方法
- super()--------------------调用父类的构造方法
classs Foo{
int value;
Foo(int value){
this.value = value;
}
}
/**
* 编译错误,子类的构造
* 方法中没有调用父类的构**造方法
* (虽然有默认的super(),但是父类
* 中没有定义无参的构造方法)
*/
class Goo extends Foo{
int num;
goo(int num){
this.num = num;
}
}
/**
*编译正确,子类中调用了父类
*的构造函数,初始化了继承自父类的
*value成员变量
*/
class Goo extends Foo{
int num;
Goo(int value,int num){
super(value);
this.num = num;
}
}