我可以在构造函数的参数中初始化一个数组

时间:2013-10-03 14:12:04

标签: java

我正在编写Triangle类的两个构造函数,它们作为参数:String,integer和double数组

private double [] side = new double[3];

public Triangle() {
    this("",0,side);
//Here I have a compile error says "Cannot refer to an instance field side while explicitly invoking a constructor"
}

public Triangle(String color, int opacity,double [] side) {
    super(color, opacity);
    this.side = side ;
}

在main方法中我想初始化三角形  但直到现在我才能这样做..

我尝试了这两种方式,但没有使用它们

    GeoShapes[1] = new Triangle( "Red"  , 89 , {2,4,3} ) ;

    GeoShapes[2] = new Triangle( "white", 68 , new double{5,6,3} );

注意: 我尝试初始化一个数组,然后将其引用放在第三个参数中 它有效,但这不是我需要的

任何人都可以帮助我在第三个参数中写什么?

3 个答案:

答案 0 :(得分:6)

你必须像这样使用它:

geoShapes[1] = new Triangle("Red"  , 89 , new double[] {2,4,3});

只能在声明点或数组创建表达式中使用数组初始值设定项。

另一种选择是使用varargs作为参数类型:

public Triangle(String color, int opacity, double... side) {
    super(color, opacity);
    this.side = side ;
}

然后您可以使用:

创建实例
geoShapes[1] = new Triangle("Red", 89 , 2, 4, 3);

关于0-arg构造函数中的问题:

public Triangle() {
    this("",0,side);
}

您尝试将实例字段side传递给参数化构造函数,该构造函数无效,因为side尚未初始化。所有初始化都在this()super()调用之后完成。您应该创建一个数组并像通常那样传递它。所以这会奏效:

public Triangle() {
    this("", 0, new double[] {0, 0, 0});
}

请遵循正确的Java命名约定。变量名以小写字母开头。

答案 1 :(得分:1)

private double [] side = new double[3];

public Test() {
    this("",0,side);
//Here I have a compile error says "Cannot refer to an instance field side while explicitly invoking a constructor"
}

您不能使用side,因为尚未真正调用构造函数,因此尚未初始化实例变量。这在Java Language Specification

中有解释
  

构造函数体中的显式构造函数调用语句可以   不引用任何实例变量或实例方法或内部   在此类或任何超类中声明的类,或使用this或super   任何表达;否则,发生编译时错误。

粗体部分指的是this()来电。

一种选择是传递一个新阵列。

public Test() {
    this("",0, new double[3]);
}

您不需要初始化side字段,因为您的构造函数都是这样做的。

对于其他牛肉,请查看其他答案。

答案 2 :(得分:0)

您在两种情况下都缺少结束括号,并且new也缺少创建数组:

new Triangle( "Red"  , 89 , {2,4,3};

应该是

new Triangle( "Red"  , 89 , new double[]{2,4,3});