【问题标题】:How do I override the toString method when my object contains an array?当我的对象包含数组时,如何覆盖 toString 方法?
【发布时间】:2017-03-26 03:25:48
【问题描述】:

在我的主要方法中,我需要打印出在第二个类中创建的两个对象。这是我的代码。

public String toString(){

        String z = "";
        for(int i = 0; i<data.length;i++){
            z = z + data[i] + ", ";
        }
        return z;
    }

我有一个 Stat 构造函数,它将数组数据设置为调用对象中调用的数组。

    public Stat(double[] d){
        double[] data = new double[d.length];
        this.data = data;

这就是我初始化数据的方式

int i=1;
private double[] data = new double[i];

这是调用类

public static void main(String[] args){
double[] data = {1.0, 2.0, 3.0};
Stat statA = new Stat(data);

data[0] = 3.0;
data[1] = 4.0;
data[3] = 5.0;

Stat statB = new Stat(data);
System.out.println("statA data= " + statA.toString());
System.out.println("statB data= " + statB.toString());

当我运行调试器时,对象包含正确的数据值,但当我调用 toString 时,它们都打印 {0.0, 0.0, 0.0}

【问题讨论】:

  • 为什么你认为问题出在toString
  • 仅供参考:如果dataList&lt;string&gt;,您可以将toString() 缩短为return String.join(", ", data);(可以很容易地制作成列表)。

标签: java arrays double tostring


【解决方案1】:

这是你的问题:

 public Stat(double[] d){
        double[] data = new double[d.length];
        this.data = data;

您创建的数据数组是新的 d.length 大小数组。 在 Java 中,新分配的内存默认填充为 0,这就是为什么您在程序中打印了这个。

更改该代码,例如:

public Stat(double[] d){
        this.data = d;

【讨论】:

  • 这基本上是正确的。但是,this.data 将是对d 的引用,而不是单独的数组,因此当statA 构造函数之后内容发生变化时,statA.data 将被更改。这显然可以通过使用单独的数组来构造statAstatB来避免,但以防万一,最好使用this.data = Arrays.copyOf(d, d.length);
  • @jonhopkins - 没错,但正如您在代码中看到的那样,作者三次想要更改数组元素的值。由于各种引用,复制数组将防止这种情况发生,这很明显。但这是作者想要的吗?
  • 更改两个对象中的数据当然是 OP 想要和期望的。在这种情况下,代码可以保持原样(当然使用您的更改)。但我想不出很多情况下这是想要的,所以我留下了我的第一条评论作为关于实际会发生什么的注释,如果这不是 OP 想要的,那么它可能会避免稍后询问为什么@ 987654330@ 和 statB 正在打印相同的内容。
【解决方案2】:

我相信你的

public Stat(double[] d){ double[] data = new double[d.length]; this.data = data;

在您创建输入数组大小 (d.length) 的新数组时导致问题,因此类中的数组不包含数据。你想要这样的东西:

public Stat(double[] d){ this.data = d }

【讨论】:

    【解决方案3】:

    如果实例成员数据放错了,你可以试试Arrays.toString(statA)

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      相关资源
      最近更新 更多