Java中的构造函数有什么意义

时间:2014-06-07 06:48:03

标签: java multidimensional-array constructor

在下面的代码中,是否有任何优点/缺点/原因只在构造函数中创建数组,即我应该注意的两个代码片段之间有什么区别吗?

仅在构造函数中。

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() {

        }
    }

一些基本问题,但我不明白为什么甚至需要构造函数.....

4 个答案:

答案 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张卡片。

但是,如果数组没有根据构造函数的类型或传递给它的值而改变,那么初始化构造函数内部的数组是没有意义的。