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

4
有一段时间我错误地认为静态[实例]变量在应用程序运行期间一直存在。然而,令我沮丧和震惊的是,我感觉这不是真的。
仅为测试目的,我创建了一个字符串静态列表,在我的主要activity类中覆盖了onDestroy方法以打印一条消息来验证应用程序是否退出。在onCreate方法中,我只是添加了一个新的string并打印了列表的内容。我发现列表的大小不断增加,并且之前添加的所有字符串值仍然存在。
我曾经在某些地方[甚至在SO上]读到过实例变量存在于应用程序存在的时间内,但我担心这并不是真的。
更准确地说,我在使用Facebook SDK for Android时意识到了这个问题。我看到SessionEvents类中的监听器列表中的AuthListener实例随着时间的推移不断增加。因此,每当启动应用程序并使用FB登录时,监听器方法会被触发与SessionEvents类中存在的实例数量相同的次数。
有人以前观察到过这种情况吗?我是否在理解Android工作原理方面犯了一些基本错误?
怎么回事?
谢谢阅读!
[更新] 我被BalusCrdineiu纠正了。我真的不想在这里创建关于实例和类变量的混乱。遗憾的是,在匆忙发布问题时,我犯了一个我不希望犯的错误。我非常清楚静态和实例变量之间的区别。我只是打算写class变量,并且无法弄清楚为什么要将静态变量称为instance变量。
然而,我的问题仍然存在。 @MisterSquonk - 不,我没有混淆我的Activity何时结束以及应用程序何时被销毁。这是我在样本上尝试的内容-我只有一个作为MainActivity。当我从这个Activity按返回按钮时,我假设Activity从堆栈中删除并且应用程序也被销毁。我启动了任务管理器来验证我的应用程序不再运行。

6
静态变量 != 实例变量 - BalusC
2
虽然与您的问题无直接关系,但是针对您所说的某些内容,“在我的主活动类中重写了onDestroy方法以打印消息以验证应用程序是否退出” - 不要混淆Activity和Application。杀死一个Activity并不一定会杀死Application(“应用程序”)。 - Squonk
@MisterSquonk - 不,我没有造成任何混淆。在我的特定应用程序中,我非常确定“activity”的终止也意味着该应用程序不再运行。我使用任务管理器进行了验证,并已更新帖子以提及此事。 - anirvan
3个回答

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

感谢您指出,是的 - 您绝对正确。然而,正如我帖子的更新所示,我希望由于我犯的愚蠢错误而不会失去我的问题意图。 - anirvan

6

我曾在Android开发者谷歌组上发布过同样的问题,非常不幸地将static变量称为instance变量。我收到了一些非常好的回应,特别是来自Kostya的回复。在那个小组中的互动帮助我理解了Android平台的基本规则。希望这个消息线程也能帮到你。


0

当应用程序关闭时,实例变量会被销毁,但一些 GUI 小部件默认情况下会保存它们的状态,然后在 onCreate 方法中恢复它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接