thinking in java ---5.初始化与清理

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](动态初始化)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值