这个问题在这里已经有答案了:
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();
}}}}
1条答案
按热度按时间ghg1uchk1#
不是的。
java是一个垃圾回收系统。你不能'取消分配'。将stuff设置为null不会使事物释放。
java将自动清理任何需要的东西,而您不需要做任何事情来实现这一点。你唯一需要担心的是编程逻辑。例如,在本例中,您确实需要
itr.remove();
呼叫-那不是关于释放一个激光物体,那是关于从游戏逻辑中移除激光枪。因此,删除空alloc行,您将得到: