java - 对象共享另一个对象(处理 3.3.7)

标签 java object arraylist processing

大家好 Stack Overflow :)

在编码方面,我是一个巨大的新手,而且我刚刚遇到了一个我的大脑无法克服的问题......

在我开始谈论这个问题之前,我将粘贴我的代码,以便提供一些上下文(如果看到它让你想吐,请提前抱歉)。该问题的主要焦点已发表评论,因此应该相当明显:

主要

ArrayList<Individual> individuals = new ArrayList<Individual>();

void setup()
{
  size(500,500);

  for(int i = 0; i < 2; i++)
  {
    individuals.add(new Individual());
  }

  println(frameRate);
}

void draw()
{
  background(230);

  for(int i = 0; i < individuals.size(); i++)
  {
    individuals.get(i).move();

    individuals.get(i).increaseTimers();

    individuals.get(i).display();
  }
}

个人

class Individual
{
  float x;
  float y;
  int size = 5;

  Timer rdyBreed;        /* Here is the object that appears to be shared 
                            between individuals of the ArrayList */
  float breedRate;
  float breedLimit;

  Individual()
  {
    x = random(0, width);
    y = random(0, height);

    rdyBreed = new Timer("rdyBreed", 0);
    breedRate = random(.2, 3);
    breedLimit = random(10, 20);
  }

  void move()
  {
    int i = (int)random(0, 1.999);
    int j = (int)random(0, 1.999);

    if (i == 0)
    {
      x = x + 1;
    } else
    {
      x = x - 1;
    }

    if (j == 0)
    {
      y = y + 1;
    } else
    {
      y = y - 1;
    }

    checkWalls();
  }

  void checkWalls()
  {
    if (x < size/2)
    {
      x = width - size/2;
    }
    if (x > width - size/2)
    {
      x = size/2;
    }
    if (y < size/2)
    {
      y = width - size/2;
    }
    if (y > width - size/2)
    {
      y = size/2;
    }
  }

  void display()
  {
    noStroke();

    if (!rdyBreed.finished)
    {
      fill(255, 0, 0);
    } else
    {
      fill(0, 255, 0);
    }

    rect(x - size/2, y - size/2, size, size);
  }

  void increaseTimers()
  {
    updateBreedTimer();
  }

  void updateBreedTimer()
  {
    rdyBreed.increase(frameRate/1000);
    rdyBreed.checkLimit(breedLimit);
    rdyBreed.display(x, y);
  }
}

计时器

class Timer
{
  float t;

  String name;

  boolean finished = false;

  Timer(String name, float t)
  {
    this.t = t;

    this.name = name;
  }

  void increase(float step)
  {
    if (!finished)
    {
      t = t + step;
    }
  }

  void checkLimit(float limit)
  {
    if (t >= limit)
    {
      t = 0;

      finished = true;
    }
  }

  void display(float x, float y)
  {
    textAlign(RIGHT);
    textSize(12);
    text(nf(t, 2, 1), x - 2, y - 2);
  }
}

现在已经完成了,让我们来回答我的问题。

基本上,我正在尝试创建某种个人康威生命游戏,但我立即遇到了很多问题。

现在,我在编写这段代码时的想法是,组成小型模拟“社会”的每个人对于不同的生活事件都有不同的计时器和值,例如交配生 child 。

问题是,我不是面向对象编程的专家,因此我很不明白为什么这些对象没有各自的计时器,而是对同一个计时器的引用。

我猜想制作一个计时器的 ArrayList 并使用多态性来发挥我的优势可以做出改变,但我不太确定它或真正如何做到这一点......是的,我需要帮助。

提前致谢:)

编辑:这是调试器的屏幕截图。每次更新迭代时,这些值都保持相同。

Screenshot

最佳答案

是什么让您认为它们引用相同的 Timer 对象?调试器中显示的 t 值将保持不变,直到其中一个达到 breedLimit 并且被设置为 0,因为它们同时被初始化。 尝试一下,看看 t 的值为 different .

void setup() {
  size(500,500);
}

void mouseClicked() {
  individuals.add(new Individual());
}

我建议在此处设置断点:

t = 0;
finished = true;

关于java - 对象共享另一个对象(处理 3.3.7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49908104/

相关文章:

java - 如何在 Spring 中访问命名空间元素的 BeanDefinitions

java - jaxb2 maven 插件,在单独的标签中定义多个模式文件

javascript - 删除一个对象的键也会删除另一个对象中的键 - Javascript

ms-access - 缩短 Access 中的对象路径名称

java - 更改局部变量中的字典对象

java - testng 保留测试中的顺序

java - Java 中的 NOAA XML 解析 - 获取纬度和经度元素

python - 在 x = 1 中,x 和 1 都是对象吗?

Android 使用 ArrayList 向多个联系人发送短信

java - 获取空对象引用但 ArrayList 已初始化