删除对象以释放内存JAVA

问题描述

我正在开发一款小型太空射击游戏。这是学习JAVA的一种有趣的方式,我想确保自己做的正确。 该对象(飞船)在运行时(激光)正在生成其他对象。 (船->激光器)。

我已经这样实现了:

  • 对象飞船绘制在屏幕上。当检测到触摸时,它将创建Laser类的 new 实例,然后将其添加到GameScreen类内部的静态LinkedList激光器中。
  • GameScreen对象负责绘制和更新屏幕上的所有激光,飞船和效果

自我解释。但是现在:

  • detectCollision()被调用,所有与舰船相交的激光器都从LinkedList激光器中删除
  • 在游戏结束时(用户退出),我遍历存储在GameScreen.lasers链接列表中的Laser类的所有实例,并将它们全部设置为 null。还将列表设置为空。

这是释放分配的内存的正确方法吗?

激光创建:

abstract class Ship {
if (canShoot()) {
    Laser laser = new Laser(new Rectangle(x,y,width,height)); // bounds
    GameScreen.playerLasers.add(laser);
}}

激光处置:

public class GameScreen {
private void dispose() {
    for (Laser laser : playerLasers) {
        laser.bounds = null;
        laser = null;
    }
    playerLasers = null;
}}

GameScreen类crashDetection():

public class GameScreen {
    private void detectCollision() {
        ListIterator<Laser> itr = playerLasers.listIterator();
        while (itr.hasNext()){
            Laser laser = itr.next();
            if (laser.bounds.overlaps(ship.bounds)){
                ship.health -= laser.damage;
                laser.bounds = null;
                laser = null;
                itr.remove();
}}}}

解决方法

不是。

Java是垃圾回收系统。您不能“取消分配”。将东西设置为null不会使东西释放。

Java将自动清理所需的内容,而您无需执行任何操作即可实现该目的。您唯一需要担心的是编程逻辑。例如,在这种情况下,您确实需要进行itr.remove();调用-这不是要释放Laser对象,而是要从游戏逻辑中删除lasershot。因此,删除空的分配行,最终得到:

if (laser.bounds.overlaps(ship.bounds)){
                ship.health -= laser.damage;
                itr.remove();
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...