自动管理Java对象

时间:2012-09-21 12:57:55

标签: java object

我还是Java的新手,我对如何使用对象感到困惑。我知道

object object = new object();

但必须手动访问这些内容。

说我想创造一个粒子效果。小白点出现在屏幕的中心,并以随机的角度慢慢移动到屏幕的边缘。当他们接近时,他们走得更快。最后,如果它们离开视图区域,它们将被删除。

如果我想用对象做这个,我需要能够:

  • 自动制作对象
  • 从每个对象收集数据(他们的X和Y坐标) 以便它们可以呈现
  • 让每个帧都更新对象,以便它们可以提高速度
  • 在超出范围时销毁对象。

如何自动制作/销毁对象,并从所有对象中获取数据,而不管有多少对象存在? 现在,我的游戏(好吧,我只用Java做过1次)仅限于使用阵列和一种细胞自动机,但这对大型游戏不起作用。

这可能之前已经被问过,或者可能有关于此的教程,但我设法找到的只是手动制作对象。我可能正在寻找错误的东西,对不起,如果是这样的话。

3 个答案:

答案 0 :(得分:3)

在java中你不会破坏对象。有垃圾收集器,它会破坏未使用的对象。将null值赋给保存对象的变量就足够了。

您可以通过System.gc()手动调用垃圾收集器。

答案 1 :(得分:0)

创建对象

我不确定“自动创建对象”是什么意思,但这就是构造函数的用途。定义构造函数时,可以在其中添加各种实现和初始化详细信息,这些详细信息将创建您的变量,使其完全按照您希望的方式创建。见"Providing Constructors for your classes"。所以说你有一点......

public Point(int x, int y) {
    this.xPos = x;
    this.yPos = y;
    this.color = Color.BLUE;
    this.size = Constants.DEFAULT_POINT_SIZE;
    // ... etc.
}

从对象收集数据

通过getter和setter(也称为accessors and mutators)获取和设置这些类中的信息。

public int getX() {
    return x;
}

public void setX(int x) {
    this.xPos = x;
}

要从现有的所有对象中收集数据,而不管有多少,只需将它们全部添加到某种List即可。您甚至可以将它们添加到构造函数中的private static ArrayList<T>并静态访问ArrayList<T>以获取您的信息,而程序的其他部分则无需“知道”有多少。

增量GUI更改

有几种方法可以实现逐帧更改,但我更喜欢使用TimerActionListener。这允许您设置帧速率,并使用public void actionPerformed(ActionEvent)方法执行所需的操作。对于初学者来说这有点复杂,所以你可能不得不做一些好的阅读和测试。请参阅"How to Write an Action Listener""How to Use Swing Timers"以帮助您入门。

销毁物品

Java中没有像C ++这样的语言中的析构函数。相反,有一个garbage collector周期性地(偶尔地)运行,它会破坏它认为不再有指向它们的引用的所有对象。因此,如果您希望垃圾收集器在超出范围时拾取对象,只需将对它们的所有引用分配给 null 。虽然这不会立即破坏对象,但它确保垃圾收集器在下次运行时“标记”它们。

如前所述,System.gc()是一种“调用”垃圾收集器的方法。但是,您不应该假设调用它将强制垃圾收集器运行。在API中,它表示此调用“建议”系统应该运行垃圾收集器。最终,它不可靠,垃圾收集通常超出了您的控制范围。

来自the API

  

调用gc方法表明Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用。当控制从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。

此外,作为侧边选择,请确保在创建对象时将类名称大写。 :)

Object object = new Object();

对于OP的特定目的:如果您担心游戏环境中“正在绘制存在的所有内容”(并且您希望立即销毁对象 为了确保游戏正常运行,请考虑使用ListSet并将其填充到您想要绘制的内容中,然后在它们离开屏幕时将其删除。


<强>参考文献:

答案 2 :(得分:0)

  

自动制作对象

答案:您始终需要new newInstance才能在java中创建对象。这将基于算法。举个例子。您可以使用二维数组来保存对象,并且可以根据X,Y位置将对象放在该数组中,并使用Random类生成X,Y位置。

e.g。

    //Initialize pallete
    Point [][] pallete = Point int [800][600];
    //Generate Objects

    Random random = new Random();
    int x = random.nextInt(800);
    int y = random. nextInt(600);

    Point point = new Point(x,y);

    //Put inside Pallete

    pallete[point.x][point.y] = point;
  

从每个对象(它们的X和Y坐标)收集数据,以便可以渲染它们

答案:如上所示,向我想要为Point [x,y]

声明的对象声明属性
  

让每个帧都更新对象,以便它们可以提高速度

答案:使用循环或定时器等提高生成速度。

  

当物体超出界限时将其销毁。

答案:只需将其初始化为null即可获得GC。如果您面对OutOfMemory问题,那么有几种方法可以解决它,但除非有需要,否则您不应该关注它。

 point = null;//This is it.