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

时间:2011-05-28 19:08:35

标签: java android static

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

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

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

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

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

是什么给了什么?

感谢阅读!

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

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

3 个答案:

答案 0 :(得分:6)

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

示例:

class Test {
    public static int a;
}

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

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

class Test {
    public int a;
}

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


举例说明:

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]
  }
}

答案 1 :(得分:6)

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

我收到了一些非常好的回复,特别是来自 Kostya 。我在该组上的互动帮助我掌握了Android平台的基本“规则”。

希望message thread能帮到你。

答案 2 :(得分:0)

当应用程序执行时,实例变量会被销毁,但默认情况下,某些gui小部件会保存其状态,然后在onCreate方法中将其恢复。