2

我正在编写一个 Triangle 类的两个构造函数,它们作为参数:一个字符串、一个整数和一个双精度数组

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 ;
}

在主要方法中,我想初始化三角形,但直到现在我还不能这样做..

我尝试了这两种方法,但都没有奏效

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

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

注意:我确实尝试过初始化一个数组,然后将它的引用放在第三个参数中,它可以工作,但这不是我需要的

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

4

3 回答 3

8

你必须像这样使用它:

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 命名约定。变量名以小写字母开头。

于 2013-10-03T14:13:05.780 回答
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语言规范中对此进行了解释

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

粗体部分是指this()调用。

一种选择是传递一个新数组。

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

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

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

于 2013-10-03T14:14:47.927 回答
0

在这两种情况下,您都缺少右括号,并且还new创建了一个数组:

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

应该

new Triangle( "Red"  , 89 , new double[]{2,4,3});
于 2013-10-03T14:13:13.580 回答