我正在尝试完成一个Java实验练习,要求在数组中显示对象(柱面)的体积。每当我尝试打印数组时,输出似乎总是数组中的最后一个对象,当我想要它们全部打印时。
这是我的Cylinder.java代码:
public class Cylinder implements Comparable<Cylinder> {
public static double radius;
public static double height;
public static String name;
public Cylinder(double radius, double height, String name){
this.radius = radius;
this.height = height;
this.name = name;
}
@Override
public int compareTo(Cylinder obj) {
Cylinder other = obj;
int result;
if (this.volume() > other.volume()){
result = -1;
}
else if (this.volume() < other.volume()){
result = 1;
}
else {
result = 0;
}
return result;
}
public double volume(){
double volume = Math.pow(radius, 2.0)*Math.PI*height;
return volume;
}
public double surface(){
double surface = (4.0*Math.PI)*Math.pow(radius, 2.0);
return surface;
}
public String toString(){
return "Name: " + name + ", radius: " + radius + ", height: " + height ;
}
}
TestSolids.java,打印数组:
import java.util.Arrays;
public class TestSolids {
public static void testCylinderSort(Cylinder[] cylinders){
for(int i = 0; i < cylinders.length; i++){
double volume = cylinders[i].volume();
System.out.println("Volume of Cylinder " + (i+1) + " " + volume);
}
}
public static void main(String[] args){
final Cylinder[] CYLINDERS = { new Cylinder(10, 5, "one"), new Cylinder(5, 10, "two"), new Cylinder(7, 7, "three") };
System.out.println(Arrays.toString(CYLINDERS));
testCylinderSort(CYLINDERS);
}
}
我的输出:
[Name: three, radius: 7.0, height: 7.0, Name: three, radius: 7.0, height: 7.0, Name: three, radius: 7.0, height: 7.0]
Volume of Cylinder 1 1077.566280181299
Volume of Cylinder 2 1077.566280181299
Volume of Cylinder 3 1077.566280181299
输出显示我可以打印数组的不同索引,但由于某种原因,它们都引用了数组的最后一个元素,我无法弄清楚为什么会这样。如果有人能告诉我这里发生了什么,以及如何打印所有阵列对象,我将非常感激。
答案 0 :(得分:2)
声明的变量是静态的。
您需要删除静态,因为静态属于类而不是成员变量。因此,每次初始化柱面的值或半径时,以下柱面值始终会覆盖先前柱面的值。
使用:
public double radius;
public double height;
public String name;
PS:
您可能希望将它们设为私有,并为更好的代码制作公共getter和setter方法
答案 1 :(得分:1)
您的实例变量声明为static
。
public static double radius;
public static double height;
public static String name;
静态变量对于该类是全局的。
所以当你创建三个对象时
final Cylinder[] CYLINDERS = { new Cylinder(10, 5, "one"), new Cylinder(5, 10, "two"), new Cylinder(7, 7, "three") };
radius
,height
和name
变量不断被替换。因此,这些变量的值是最后设置的值。
new Cylinder(7, 7, "three")
这就是你认为“迭代总是返回最后一个元素”。
实际发生的是返回不同的对象,但它们具有相同的变量集(在类级别),而不是每个对象具有一组变量(在对象级别)。
修复方法是删除static
关键字。