java 变量与对象的生命周期

一, 变量的生命周期与范围

只要变量的堆栈块还存在于堆栈上,变量就算活着.也就是说活到方法执行完毕为止.

局部变量的范围只限于申明他的方法之内. 当此方法调用别的方法时,该变量还活着,但不在目前的范围内. 执行其他方法完毕返回时,范围也就跟着回来.

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;

你可能感兴趣的:(java 变量与对象的生命周期)