程序示例:
public class main extends ApplicationAdapter
{
public static int a;
public static int b;
public static Player player;
public void create()
{
resume();
}
public void render()
{
}
public void resize()
{
}
//pause runs when home button is pressed
public void pause()
{
player = null;
}
//resume runs when the program is re-opened
public void resume()
{
a = 10;
b = 20;
player = new Player();
}
}
在android上,当按下主页按钮时,程序保存在内存中,静态变量保持其值。现在重新打开这个程序时,这个例子是创建新的静态变量还是只为内存中的旧静态变量赋值?
我问,因为我有一个程序有一个问题,按回家并重新打开程序导致内存每次增加,我想知道这是否可以发挥作用为什么这样做发生。
更新:播放器对象在再次创建之前被声明为null时是否会从内存中删除?
答案 0 :(得分:2)
静态引用的生命周期与应用程序的生命周期不同。换句话说,应用程序的多个实例可能使用相同的静态变量。
如果在应用程序的方法中将静态变量设置为null
,那么对于在同一VM中运行的应用程序的所有实例,您将其设置为null
。设置对null
的引用并不意味着内存实际上是免费的。只有当没有对同一对象的其他引用并且运行垃圾收集器时,才会删除该对象。
尽管如此,请注意pause
和resume
方法不是正确的方法。实际上,出于上述原因,除非您正确管理这些static
引用,否则不应将static
关键字用于特定于应用程序的一个实例的内容。例如,libgdx通过保留应用程序实例的映射及其使用的资源来在幕后执行此操作。这使您可以拥有"托管资源"在需要时自动重新加载(这是默认设置)。
如果您的情况过于复杂,只需删除static
关键字就更容易了。这通常也会迫使您拥有更好的OO设计,而不是使用快捷方式,例如单身模式,从长远来看通常会导致其他问题。
答案 1 :(得分:0)
创建新的静态变量或只是将值分配给内存中的旧静态变量?
仅按a
方法将值分配给b
,resume()
。
静态变量仅在执行开始时初始化一次。
修改强>
您正在创建Player
的新对象并分配给player
引用变量。之后你没有旧玩家对象的引用所以当JVM觉得需要运行垃圾收集器时,垃圾收集器会运行并清除旧玩家对象的内存。