静态(类)变量的生命周期

ani*_*van 4 java static android

很长一段时间,只要应用程序运行,我就认为静态[实例]变量存在是幸福的.然而,令我沮丧的是,我惊慌失措,我觉得这不是真的.

仅仅测试,我创建了一个静态的字符串列表,并在我的主activity类中覆盖了onDestroy打印消息的方法,以验证应用程序退出.在onCreate方法中我只需添加一个新的string,并打印列表的内容.我发现的是列表的大小不断增加,之前添加的所有字符串值仍然存在.

我已经阅读了[甚至在这里的SO],只要应用程序存在实例变量,但我担心它并非如此.

更确切地说,我在使用Facebook SDK for Android时意识到了这个问题.我已经看到,班级AuthListener中听众列表中的实例SessionEvents随着时间的推移不断增加.因此,无论何时启动应用程序并且用户使用FB登录,侦听器方法都会被触发,因为类中存在实例SessionEvents.

有人曾经观察到这一点,并且有一些重大错误我正在致力于理解android是如何工作的吗?

是什么赋予了?

谢谢阅读!

[ 更新 ]
我站在纠正BalusCrdineiu.我真的不想在这里创建关于实例和类变量的混淆.唉,我急忙发布我的问题,我犯了一个我不想做的错误.我很清楚staticinstance变量之间的区别.我只是想编写class变量,并不能完全弄清楚将静态变量称为instance变量的过程.

但是,我的问题仍然存在. @MisterSquonk - 不,我不会在这里混淆我的Activity目的何时以及应用程序何时被销毁.这是我在样本上尝试的内容 - 我只有一个Activity用作样本Main.当我按下后退按钮时Activity,我假设Activity从堆栈中删除了应用程序并且应用程序也被破坏了.我已启动任务管理器以验证我的应用程序不再运行.

rid*_*rid 6

您似乎没有区分静态变量和实例变量.静态变量是在类本身上定义的.实例变量仅存在于类实例中.

例:

class Test {
    public static int a;
}
Run Code Online (Sandbox Code Playgroud)

变量a是在类本身上定义的,而不是在类的实例上定义的.每个实例都将访问同一个变量.如果一个实例设置ato 的值5,则每个其他实例都将该值视为5.实例消失后,变量不会消失,因为它与任何实例无关(它是一个类变量).它会一直持续到那个时间结束(或者直到应用程序退出,以先到者为准).

另一方面,以下示例使用实例变量:

class Test {
    public int a;
}
Run Code Online (Sandbox Code Playgroud)

此变量只能从类的实例访问.每个实例都有一个不同的变量副本.一旦实例被销毁,变量就会随之而来.


为了显示:

import java.util.List;
import java.util.ArrayList;

class Test {
  // instanceVar will be initialized whenever a new Test object is created
  private List<Integer> instanceVar = new ArrayList<Integer>();

  // staticVar will be initialized right now
  private static List<Integer> staticVar = new ArrayList<Integer>();

  public void updateInstanceVar() {
    instanceVar.add(1);
    instanceVar.add(2);
  }

  public void updateStaticVar() {
    staticVar.add(1);
    staticVar.add(2);
  }

  public static void main(String[] args) {
    Test test1 = new Test();
    test1.updateInstanceVar(); // test1.instanceVar = [1, 2]
    test1.updateStaticVar();   // Test.staticVar    = [1, 2]

    Test test2 = new Test();
    test2.updateInstanceVar(); // test2.instanceVar = [1, 2]
    test2.updateStaticVar();   // Test.staticVar    = [1, 2, 1, 2]
  }
}
Run Code Online (Sandbox Code Playgroud)


ani*_*van 6

所以 - 我在Android Developer Google小组上发布了同样的问题[不幸的是将static变量称为instance变量的错误].

我收到了一些非常好的回应,特别是来自克斯特亚.我在该组上的互动帮助我掌握了Android平台的基本"规则".

希望消息线程也能帮到你.