我的Java对象数组只返回最后一个元素

时间:2018-02-27 19:25:59

标签: java arrays object for-loop

我正在尝试完成一个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

输出显示我可以打印数组的不同索引,但由于某种原因,它们都引用了数组的最后一个元素,我无法弄清楚为什么会这样。如果有人能告诉我这里发生了什么,以及如何打印所有阵列对象,我将非常感激。

2 个答案:

答案 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") };

radiusheightname变量不断被替换。因此,这些变量的值是最后设置的值。

new Cylinder(7, 7, "three")

这就是你认为“迭代总是返回最后一个元素”。

实际发生的是返回不同的对象,但它们具有相同的变量集(在类级别),而不是每个对象具有一组变量(在对象级别)。

修复方法是删除static关键字。