在下面的代码中,是否有任何优点/缺点/原因只在构造函数中创建数组,即我应该注意的两个代码片段之间有什么区别吗?
仅在构造函数中。
public class multidimensionalarraysExp {
public multidimensionalarraysExp() {
int[][] intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
}
}
与此相比:
public class multidimensionalarraysExp {
private int[][] intArray;
public multidimensionalarraysExp() {
intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
}
}
我假设它是因为如果我在构造函数中创建它,我不能说它是公共的还是私有的等等。这样做是默认的吗?
当然我可以做到这一点,但是为什么首先要有一个构造函数呢?
public class multidimensionalarraysExp {
private intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
public multidimensionalarraysExp() {
}
}
一些基本问题,但我不明白为什么甚至需要构造函数.....
答案 0 :(得分:3)
在第一个中,您将数组声明为局部变量,因此它只能在构造函数中访问。
在第二个中,可以在整个班级(private
)中访问该数组。
根据这个answer(适合你的情况),有一些理由更喜欢使用第三种方式:
- 没有区别 - 实例变量初始化实际上是由编译器
放入构造函数中的- 第三个片段更具可读性
- 您无法使用第三个代码段进行异常处理
- 还有初始化块,编译器也将它放在构造函数中。
答案 1 :(得分:1)
public multidimensionalarraysExp() {
int[][] intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
}
这里的数组只能在构造函数中访问,因为它是构造函数的局部变量。
虽然如果在类级别声明数组,您可以在整个类中访问它,但是在以下情况下使用默认构造函数创建类的实例时会初始化它。
public multidimensionalarraysExp() {
intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
}
因此,如果您创建new multidimensionalarraysExp()
,您的数组将被初始化。
为什么首先有一个构造函数?
只有在第二种情况下创建实例之后才会为变量赋值。
如果要为不同的类实例分配不同的数组值,可以将数组作为参数传递给构造函数。
public multidimensionalarraysExp(int[][] intArray) {
this.intArray = intArray;
}
答案 2 :(得分:1)
在第一个片段中,您的数组是一个局部变量,因此在此类的其他方法中不可用。
在您的情况下,在构造函数(第2个代码段)中初始化数组或在声明字段(第3个)时初始化数组没有区别。只有在构造函数中初始化数组的原因是,如果要传递一些参数。
根据oracle's docs,可以两种方式进行,没有偏好。
答案 3 :(得分:1)
构造函数的目的是初始化对象的状态。
您可以使用构造函数初始化数组,例如,如果数组的长度或其值将根据传递给构造函数的值而更改。
作为一个例子,一张卡片可以接受一个套装,它会用给定的套装初始化所有12张卡片。
但是,如果数组没有根据构造函数的类型或传递给它的值而改变,那么初始化构造函数内部的数组是没有意义的。