2016-02-29 74 views
0

所以我有这样的一段代码声明一个三维数组:为什么我不能在Java中使用变量来声明三维数组?

public class Matrix { 
    private static int n; 
    char[][][] matrix = new char[n][n][2]; 
    Matrix(int n){ 
     n=3; 
    } } 

在类的构造函数,正被用一个值初始化(假设3)。

问题是,当我尝试访问矩阵元素(让我们说矩阵[0] [0] [0]),我得到一个“ArrayIndexOutOfBoundsException”。

看来,我的矩阵中有0

长度但是,如果我尝试类似:

char[][][] matrix = new char[3][3][2] 

它工作得很好,内存alocated的矩阵。

而且,在我的节目,我用在某些时候是这样的:

char[][] bidimensionalMatrix = new char[n][n]; 

也用得好好的,我可以访问此一个的元素了。

这是为什么?我不允许使用变量来指定三维矩阵的维度?

+2

'N'是'0'阵列被构造时。 –

+1

扩展Oliver的评论。未初始化的数字字段默认为'0' –

+0

所以你说我的矩阵的内存是在类的构造函数执行之前分配的?因为它是在这个类的构造函数中初始化的。好吧,我没有发布构造函数,我将编辑 –

回答

2

您可以使用变量定义数组的大小。但是,您的构造函数在之后已经初始化了数组,并且当数组初始化时,'n'为0.请记住,数组大小不能被一旦创建就被更改。相反,你应该在你的构造函数中初始化数组。

public class Matrix { 
    private static int n; 
    char[][][] matrix; 

    Matrix(int num){ 
     n = num; 
     matrix = new char[n][n][2]; 
    } 
} 
+0

是的,它的工作,非常感谢你 –

0

您必须初始化的n前值可以指定数组的大小。

这是一个简单的类与多个大小的数组。

class Matrix { 
    private int width, height, depth; 
    private char[][][] matrix; 

    public Matrix(int width, int height, int depth) { 
     matrix = new char[height][width][depth]; 
    } 

    public void set(int i, int j, int k, char value) { 
     matrix[i][j][k] = value; 
    } 

    public char get(int i, int j, int k) { 
     return matrix[i][j][k]; 
    } 
} 

样品运行

class Main { 
    public static void main(String[] args) { 
    Matrix m = new Matrix(2, 2, 2); 
    m.set(0, 0, 0, 'c'); 
    System.out.println(m.get(0, 0, 0)); // c 
    } 
} 
相关问题