在下面的代码中,只在构造函数中创建数组有什么优点/缺点/原因吗?也就是说,我应该知道下面的两段代码之间有什么区别吗?
仅在构造函数中。
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() {
}
}
一些基本问题,但我不明白为什么需要一个构造函数。。。。。
在第一个例子中,您将数组声明为局部变量,因此它只能在构造函数内部访问。
在第二个例子中,数组将在整个类(private
(中可访问。
根据这个答案(根据您的情况调整(,有一些理由更喜欢使用第三种方式:
- 没有区别-实例变量初始化实际上是由编译器放入构造函数中的
- 第三个片段可读性更强
- 不能对第三个代码段进行异常处理
- 另外还有初始化块,它也由编译器放入构造函数中
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;
}
在第一个片段中,您的数组是一个局部变量,因此它在此类的其他方法中不可用。
在您的情况下,在构造函数中初始化数组(第二个片段(和在声明字段时初始化数组(第一个片段(没有区别。在构造函数中初始化数组的唯一原因是若要传递一些参数。
根据oracle的文档,两种方式都可以,没有偏好。
构造函数的作用是初始化对象的状态。
例如,如果数组的长度或其值会根据传递给构造函数的值而变化,则可以使用构造函数初始化数组。
例如,一个类卡可以接受一套套装,这将初始化具有给定套装的所有12张卡。
但是,如果数组没有根据构造函数的类型或传递给它的值而更改,那么在构造函数内部初始化数组是没有意义的。