0

所以我对 Java 比较陌生,而且我一直在使用 Eclipse。主要部分是最后三行,我想让对象myBrick多次出现。如果我运行它,它只会出现在第二个位置(最后一行)。可能吗?

import acm.graphics.*;
import acm.program.*;
import java.awt.*;

public class Pyramid extends GraphicsProgram {

    /** Width of each brick in pixels */
    private static final int BRICK_WIDTH = 30;

    /** Height of each brick in pixels */
    private static final int BRICK_HEIGHT = 12;

    /** Number of bricks in the base of the pyramid */
    private static final int BRICKS_IN_BASE = 14;

    public void run() {
        double windowWidth = 756;
        double windowHeight = 494;
        int numberOfBricks = (BRICKS_IN_BASE*(BRICKS_IN_BASE+1))/2;

        double emptySpace = windowWidth - (BRICK_WIDTH*BRICKS_IN_BASE);
        int cushion = (int)emptySpace/2;

        GRect myBrick = new GRect(BRICK_WIDTH, BRICK_HEIGHT);
        add(myBrick, cushion, (windowHeight-BRICK_HEIGHT));
        add(myBrick, (cushion+BRICK_WIDTH), (windowHeight-BRICK_HEIGHT));
    }
}
4

3 回答 3

2

我认为问题可能是当您使用第二个 add() 方法时,它使用的是相同的 myBrick 对象,而不是创建第二个对象。尝试为您的第二个 add() 函数创建一个新的 GRect 对象。

于 2013-02-11T05:28:13.667 回答
0

第二个add()是使用与第一个相同的对象引用。Java 是一种按值传递的语言,但它将引用的值传递给对象。这意味着无论第一次发生的任何突变add()都会myBrick被第二次add()调用看到,我确信这违反了程序的语义。(我建议你阅读这篇 SOF 帖子

对象的构造GRect似乎并不太复杂,那么为什么不复制这条指令并将其用于每个add()调用的第一个参数呢?这样,您可以确保您有两个GRect以相同状态开始的对象,但修改一个不会影响另一个。

于 2013-02-11T06:00:16.410 回答
0

正如其他人所指出的,不看 add 方法,很难给你答案。但如果我没记错的话,可能你正在寻找这样的东西,

  1. 创建该对象的列表。列表 rectList = new ArrayList();
  2. 创建新的 GRect 对象,然后调用 add 函数。
  3. 将新的 GRect 对象添加到 rectList。

这样在列表中您将拥有三个 GRect 对象。您可以迭代并获取 GRect 对象的值。

于 2013-02-11T06:03:15.340 回答