删除对象以释放内存

7vux5j2d  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(350)

这个问题在这里已经有答案了

java中的垃圾收集器是什么((16个答案)
4个月前关门了。
我正在开发一个小的太空射击游戏。这是一种学习java的有趣方式,我想确保我做的事情是正确的。此对象(船)正在运行时生成其他对象(激光)(船舶->激光)。
我是这样实现的:
目标船在屏幕上绘制。当touch被检测到时,它正在创建类laser的新示例,然后将它们添加到gamescreen类内部的静态linkedlist lasers中。
gamescreen对象负责绘制和更新屏幕上的所有激光、飞船和效果。
不言自明。但现在:
调用detectcollision(),所有与舰船对象相交的激光将从linkedlist激光中删除。
在游戏结束时(用户退出),我遍历存储在gamescreen.lasers链表中的laser类的所有示例,并将它们全部设置为null。完成后,我还将列表设置为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类collisiondetection():

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();
}}}}
ghg1uchk

ghg1uchk1#

不是的。
java是一个垃圾回收系统。你不能'取消分配'。将stuff设置为null不会使事物释放。
java将自动清理任何需要的东西,而您不需要做任何事情来实现这一点。你唯一需要担心的是编程逻辑。例如,在本例中,您确实需要 itr.remove(); 呼叫-那不是关于释放一个激光物体,那是关于从游戏逻辑中移除激光枪。因此,删除空alloc行,您将得到:

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

相关问题