我想要一些帮助来理解如何将对象设置为 null 在 java 中的工作原理。我有一种情况,乍一看似乎设置为 null 的对象突然不为 null,但显然情况并非如此。
我有一个类,我在其中创建一个对象。这个对象是一个场景。这是一个 Open GL ES 2.0 项目,因此该场景的 render() 和 updateLogic() 方法是从 onDrawFrame 调用的(这是通过场景管理器控制的,因此我们可以轻松切换场景)。
所以,我可能会有这样的事情(出于问题的目的,代码被删减):
public class MyGLRenderer implements GLSurfaceView.Renderer{
MyScene myScene;
SomeOtherScene someOtherScene;
public void createScenes(){
myScene = new MyScene(this);
someOtherScene = new SomeOtherScene(this);
SceneManager.getInstance().setCurrentScene(myScene);
}
public void cleanUp(){
myScene = null;
Log.v("tag","myScene (from MyGLRenderer) is: "+myScene);
SceneManager.getInstance().setCurrentScene(someOtherScene); //Scene changed but this won't take effect until the next 'tick'
}
@Override
public void onDrawFrame(GL10 gl) {
SceneManager.getInstance().getCurrentScene().updateLogic();
SceneManager.getInstance().getCurrentScene().render();
}
}
在上述情况下,处理被移交给myScene,看起来像这样:
public class MyScene implements Scene{
MyGLRenderer renderer;
public myScene(MyGLRenderer renderer){
this.renderer = renderer;
}
@Override
public void render(){
//Render something here
}
@Override
public void updateLogic(){
doSomething();
//The condition here could be anything - maybe the user taps the sceen and a flag is set in onTouchEvent for example
if (someConditionIsMet){
renderer.cleanup();
}
Log.v("tag","myScene (from within myScene) is: "+this);
}
}
因此,当我使用我的场景管理器设置场景时,处理将移交给该场景,并且它的 updateLogic 和渲染方法会从 onDrawFrame 连续调用。
当我运行我的代码时,我很惊讶它没有因 NullpointerException 而崩溃。日志是这样的:
myScene (from within myScene) is: com.program.name.MyScene@26354632
myScene (from within myScene) is: com.program.name.MyScene@26354632
myScene (from within myScene) is: com.program.name.MyScene@26354632
myScene (from within myScene) is: com.program.name.MyScene@26354632
myScene (from within myScene) is: com.program.name.MyScene@26354632
myScene (from within myScene) is: com.program.name.MyScene@26354632
myScene (from within myScene) is: com.program.name.MyScene@26354632
myScene (from within myScene) is: com.program.name.MyScene@26354632
myScene (from MyGLRenderer) is: null
myScene (from within myScene) is: com.program.name.MyScene@26354632
如您所见,“myScene”在调用 cleanUp() 方法并将其设置为 null 之前一直有效。但是代码然后返回到 myScene 以完成,它仍然有效(不为空)。
我真的很想了解 Java 中的事情是如何工作的——为什么它在一分钟内(或从一个地方)似乎是空的,然后又不是(从另一个地方)?