【问题标题】:How to set-up/use a 2D dimensional array as member of a Java class如何设置/使用二维数组作为 Java 类的成员
【发布时间】:2014-12-12 18:29:17
【问题描述】:

我知道这可能是一个超基本的 Java 问题,但我是 Java 的新手。

假设我在 Java 中有以下两个类:

public class Cell {

    private Integer value;

    public Integer setValue(Integer value) {
        this.value = value;
    }

    public Integer getValue() {
        return value;
    }

}

public class Grid {

    private Cell[][] cells = new Cell[9][9];

    public void setCell(int row, int column, Integer value){
        cells[row][column].setValue(value);
    }

}

更不用说如果行或列超过 8 则代码是不安全的,我的理解是 Grid 为 9 x 9 Cells 分配内存,因此方法 setCell(1,1, 10) 应该没问题(即不会导致 NullPointerException),对吗?但是,在为这种情况进行 JUnit 测试时,这正是我遇到的错误。如果不是

,我只能克服这个错误
    cells[row][column].setValue(value);

我用

    cells[row][column] = new Cell();
    cells[row][column].setValue(value);

但我的印象是我实例化了两次 Cell。我在这里想念什么?是指令

    private Cell[][] cells = new Cell[9][9];

只是分配结构(即指针)来保存 Cell 对象而不实际为对象本身保留内存?

谢谢!

@Tryskele

【问题讨论】:

    标签: java arrays memory


    【解决方案1】:

    new Cell[9][9]; 创建可以保存Cell 对象实例的数组,但实际上并没有用Cell 类的新实例填充它。取而代之的是null

    一开始你可能会觉得很奇怪,但这种行为是有原因的,而且很简单:

    • 编译器无法决定应该使用哪个构造函数,
    • 但即使它知道这一点,它仍然不知道应该将哪些数据作为构造函数参数传递

    就像File 类没有无参数构造函数new File()(这样的文件代表什么?)程序员有责任决定如何初始化新对象和何时它们应该被放置在数组中。

    最常见的方法是在构造函数中进行,或者如果你有很多,你也可以使用初始化块(它将被移动到每个构造函数),例如:

    class Grid {
    
        private Cell[][] cells = new Cell[9][9];
        {
            for (int i = 0; i<cells.length; i++){
                for (int j = 0; j<cells[i].length; j++){
                    cells[i][j] = new Cell();//lets use no-argument constructor
                }
            }
        }
    
        public void setCell(int row, int column, Integer value){
            cells[row][column].setValue(value);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      在创建任何对象类型的数组(任何维度)时,数组的所有元素都初始化为null。没有隐式创建对象,因此还没有创建 Cell 对象。此行仅创建数组:

      private Cell[][] cells = new Cell[9][9];
      

      这就是你必须使用这一行的原因:

      cells[row][column] = new Cell();
      

      您没有创建两次Cell。您只能显式创建Cell,并且必须这样做一次。

      【讨论】:

        【解决方案3】:
        private Cell[][] cells = new Cell[9][9];
        

        不会创建 81 个 Cell 实例,它会创建一个数组来存储这些对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多