我正在编写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} );
注意: 我尝试初始化一个数组,然后将其引用放在第三个参数中 它有效,但这不是我需要的
任何人都可以帮助我在第三个参数中写什么?
答案 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});