如何设置/使用二维数组作为Java类的成员

如何设置/使用二维数组作为Java类的成员,java,arrays,memory,Java,Arrays,Memory,我知道这可能是一个非常基本的Java问题,但我对Java完全是个新手 假设我有以下两个Java类: public class Cell { private Integer value; public Integer setValue(Integer value) { this.value = value; } public Integer getValue() { return value; } } public

我知道这可能是一个非常基本的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个单元格分配内存,因此方法setCell(1,1,10)应该是正常的(即不会导致NullPointerException),对吗?然而,在为这种情况进行JUnit测试时,这正是我遇到的错误。我只能克服这个错误,而不是

    cells[row][column].setValue(value);
我用

但我有一个印象,我是实例化细胞两次。我错过了什么?这是说明书吗

    private Cell[][] cells = new Cell[9][9];
仅仅分配结构(即指针)来保存单元格对象,而不实际为对象本身保留内存

谢谢

@Tryskele

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

private Cell[][] cells = new Cell[9][9];
cells[row][column] = new Cell();
这就是您必须使用此行的原因:

private Cell[][] cells = new Cell[9][9];
cells[row][column] = new Cell();
您没有两次创建
单元格。只能显式地创建
单元格
,并且必须创建一次

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

不创建81个单元格实例,而是创建一个数组来存储这些对象。

新单元格[9][9]
创建一个数组,该数组可以容纳
单元格
对象的实例,但实际上并不填充
单元格
类的新实例。而是用
null
填充

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

  • 编译器无法决定应该使用哪个构造函数
  • 但即使它可以知道,它仍然不知道哪些数据应该作为构造函数参数传递
就像
File
类没有参数构造函数
new File()
(这样的文件代表什么?)一样,程序员有责任决定如何初始化新对象以及何时将它们放入数组中

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

类网格{
专用小区[][]小区=新小区[9][9];
{
对于(int i=0;i