一, 变量的生命周期与范围
只要变量的堆栈块还存在于堆栈上,变量就算活着.也就是说活到方法执行完毕为止.
局部变量的范围只限于申明他的方法之内. 当此方法调用别的方法时,该变量还活着,但不在目前的范围内. 执行其他方法完毕返回时,范围也就跟着回来.
public void doStuff(){ //运行在堆栈,
boolean b = true; //存活于 doStuff 之中
go(4); //调用 go
//执行完毕后 b 死去
}
public void go(int x){
int z = x + 24; //x, z, b 都存活, 但 b 不在 go 的范围之中
crazy(); //调用 crazy
//执行完毕后返回 doStuff x, z 死去
}
public void crazy(){
char c = 'a'; //x, z, b, c 都存活,但只有 c 在 crazy 的范围之中
//执行完毕后返回 go c 死去
}
引用变量与 primitive 主数据类型相同, 引用变量只有能在处于它的范围之内才能被使用.
二, 对象的生命周期
只要有活着的引用, 对象也就活着. 如果某个对象的引用已经不再他的范围中,但此对象的引用还是活着的, 则此对象就会继续活在堆上
如果对象的唯一引用死了,对象就会从堆中被踢开 ( 变成可回收的 ). 引用变量会跟着对象一块解散.
释放对象的三种方法,
- 引用永久性的离开他的范围
public void go(){
Life l = new Life(); // l 在方法执行完毕的时候消失
}
- 引用被赋值到其他对象上
Life l = new Life(); //该对象会在 l 被赋值到别处时消失
l = new Life(); //
- 直接将引用赋值为 null
Life l = new Life();//该对象会在 l 被赋值 null 时消失
l = null;
网友评论