Moosphan/Android-Daily-Interview

2019-12-19:谈一谈Java成员变量,局部变量和静态变量的创建和回收时机?

MoJieBlog opened this issue · 5 comments

2019-12-19:谈一谈Java成员变量,局部变量和静态变量的创建和回收时机?

个人简单理解(java基础的东西):

  1. 成员变量:属于类,也就是对象,对象实例化它创建,对象销毁他销毁,举个栗子:
    class Test{
    var name =“github”; //成员变量
    fun myName() {
    Toast.showShort(context, this.name); //自己可以直接用,别的类需要实例化一下才能用,
    }
    }
    2.局部变量:是一般多是方法中定义的变量(生命周期相对其他两个是最短的),创建和回收 都会随着方法的使用改变

3.静态变量:比较常用,大家都可以直接调用(类名直接 . ***就可以了 ) ,随着类创建而创建,类消失它也消失

欢迎指正一下,有事容易记混

我理解的和楼上差不多,但是有的地方还不是太一样。当然这也是我自己的理解,欢迎指正。

  • 成员变量:随着类对象的创建而创建,类对象不被引用时,会被标记为可以回收。在下一次内存回收时被回收。
  • 局部变量:随着方法的调用被创建,方法执行完毕,被标记为可以被回收,在下一次内存回收时被回收。
  • 静态变量:当类被加载时,直接创建。注意这里是加载,就算没有创建类对象,只是import,静态变量也会被创建。当类销毁时,被标记为可以回收。在下一次内存回收时,被回收。

成员变量:生命周期伴随类对象,类对象回收时回收 存在堆里
静态变量:不回收 在方法区 随着类的加载而加载,随着类的消失而消失,由于类需要非常长时间的不使用,不利用,不关联,才有可能会被回收机制回收,
所以静态成员变量的生命周期特别长,除非是共享数据,否则不建议使用静态;
局部变量:方法调用时创建 方法结束时被标记为可回收 存在栈里

这个可以通过饿汉式的单例模拟为撒没有并发问题去理解

byedo commented

成员变量:生命周期伴随类对象,类对象回收时回收 存在堆里 静态变量:不回收 在方法区 随着类的加载而加载,随着类的消失而消失,由于类需要非常长时间的不使用,不利用,不关联,才有可能会被回收机制回收, 所以静态成员变量的生命周期特别长,除非是共享数据,否则不建议使用静态; 局部变量:方法调用时创建 方法结束时被标记为可回收 存在栈里

局部变量:方法调用时创建 方法结束时被标记为可回收 存在栈里
局部变量也可以存在堆里,比如:
public void a(){
Object a = new Object();
}