5.构造器
除了构造器外,编译器禁止在其他任何方法中调用构造器 p171
垃圾回收前需要做什么操作,可以定义一个finalize()方法在回收前进行必要的清理工作 (比如调用外部方法,eggC语言的malloc方法手动分配内存,在垃圾回收前需要调用free方法来释放,不然会内存泄漏 p173
6.垃圾回收
引用计数器,当一个对象被引用时,引用计数器加一,当引用离开作用于或者置为空时,引用计数减一,当垃圾回收器遍历引用计数器为0时则回收内存空间。引用计数器会出现一个问题,看下面的代码
public class MyObject(){
public Object obj;
public static void main(String args[]){
MyObject my1 = new MyObject();
MyObject my2 = new MyObject();
my1.obj = my2;
my2.obj = my1;
my1 = null;
my2 = null;
}
}
当执行到my2.obj = my1时 ,两个对象的引用计数器都为2,当执行Null,便都为1,如果想要执行垃圾回收,则必须计数器为0,但是my1指向的对象的obj指向my2,所以如果想让my2回收,则my1的obj必须被回收,同理,my1的对象想被回收也需要my2的obj被回收,因此陷入循环,不能回收。
今天找到一句名言(
问题在于,成员变量 obj 是没有办法减低引用计数的,
为什么呢,因为它们在对象 A 和 B 里面啊,也就是在堆上啊。
无法再操作这两个变量
)
再次理解:my1指向的object和My2指向的object引用计数器都为1时,my1指向的object想被回收,那么my2必须清除my2.obj的引用,但是想清楚my2.obj的引用,必须先回收m2指向的obj,那么就陷入循环了
变量初始化
静态变量>变量>构造函数
数组初始化三种方式
int[] i = {} ; int [] i = {new Integer()};int[] i = new int[10](动态初始化)