1.对象的生命周期
umm,对象的生命周期取决于引用对象的'引用'了。
eg:Duck duck=new Duck(); duck就是一个引用。
如果引用还活着,则对象也会继续活在堆上,如果引用(duck)死了,则对象也会跟着殉情-------陪葬------送命-------自挂东南枝。
我对象说,不!QAQ还是‘对象’说:引用在我在,引用亡我亡。
2.引用变量的生命周期
如果对象的生命周期要看引用变量的生命周期,那么引用变量到底会活多久呢?
那么问题来了啦!~!~!~!QAQ!!
umm,这个就要看 它是局部变量还是实例变量了
3.局部变量:
仅仅只有它所在的那个方法体之内了。(只会有read()记得它了)
只要变量的堆摘块还存在于堆栈上,局部变量就还活着。也就是说----活到方法执行完毕为止。
public class Life{
private string duck; //实例变量的寿命与对象相同,如果对象在,实例变量也在
//实例变量----依靠》对象-----》引用
public void read(){
int s=12; //变量s仅限于在read()的方法体内来使用。
sleep():
}
public void sleep(){
s=7; //这里就要报错了
}
}
那么对象中的实例变量呢?
4.实例变量:
对象认为他是自己家孩子,衣食住行全包。
我对象会记得我的
umm,对象中的实例变量的声明周期取决于对象的声明周期。
实例变量:对象在,我在。对象亡,我亡。
5.引用变量呢?
对象认为他是别人家的孩子,只会记下名字。不管衣食住行。
究级问题:引用变量的生命周期时如何影响对象的生命周期的?
只要有活着的引用,对象也就会活着。如果某个对象的引用已经不在它范围中了,但此引用还是活着的,则此对象就会继续活在堆上。
如果对对象的唯一引用死了QAQ,那对象岂会苟活在人间?对象也会从堆中被踢.引用变量会跟堆栈块一起解散,因此被踢开的对象也就正式的声明出局.关键在于知道何时对象会变成可被垃圾收集器(GC)回收的.
6.那么问题又来了,什么时候对象就被垃圾回收器给干掉了QAQ!?
一旦对象符合垃圾收集器(GC)的条件,你就无需担心回收内存的问题.如果程序内存不足,GC就会去歼灭部分或全部的可回收对象.可能会遇到内存不足的情况,但这要等到所有可回收的都被回收掉也还不够的时候才会发生.需要注意的是:
引用计数算法(垃圾回收机制中的一种算法):对象用完了就要抛弃。。(这不是渣男嘛?),这样才能让(第三者)垃圾回收器又东西可以回收.如果把持着对象不放,垃圾回收也帮不了什么忙。
当最后一个引用消失时,对象就会变成可回收的。(这时候,GC也差不多开始要动手了)
其实,事实上,辣鸡回收算了有好多种的,引用计数算法只是其中的一种啦:但是这个算法对于对象之间相互循环引用就不好处理了,
后续算法,日后再详细记录,最近要考试哦
umm.有三种方法可以释放对象的引用;
1.引用离家出走:引用永久性的离开它的范围。
life会在方法结束时消失
public void leave(){
Life life=new Life();//life会在方法结束时消失
}
2.引用出轨:引用被赋值到其他对象上。
第一个对象会在life被赋值到别处时挂掉
Life life = new Life();
life = new Life(); //第一个对象会在life被赋值到别处时挂掉
3.引用无欲无求:直接将引用设定为null。
第一个对象会在life被赋值为null时击毙
Life life=new Life();
z=null; //第一个对象会在life被赋值为null时击毙