当我的对象包含数组时,我该如何重写toString方法?

问题描述:

在我的主要方法中,我需要打印出在第二个类中创建的两个对象。这是我的代码。当我的对象包含数组时,我该如何重写toString方法?

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}

+0

为什么你认为问题是'toString'? –

+0

仅供参考:您可以将'toString()'缩短为'返回String.join(“,”,data);'如果'data'是'List '(可以轻松制作成列表)。 – Gavin

我相信你的

0可以在创建输入数组大小( d.length)的一个新的数组

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

引起该问题,因此,与类中的阵列不包含数据。你想要的东西,如:

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

您可以Arrays.toString(statA)尝试,如果该实例成员的数据是错误的。

这里是你的问题:

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

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

更改代码,e.x:

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

这大多是正确的。但是,'this.data'将是对'd'的引用,而不是单独的数组,因此当在statA构造函数后改变内容时,statA.data将被改变。这显然可以通过使用单独的数组来构建'statA'和'statB'来避免,但最好使用'this.data = Arrays.copyOf(d,d.length);'以防万一。 – jonhopkins

+0

@jonhopkins - 这是真的,但正如你在代码中看到的,作者三次想要改变数组元素的值。 复制数组可以防止这种情况,这很明显,因为有各种引用。但是,作者想要什么? –

+0

改变这两个对象中的数据当然是可能的,这是OP希望和期望的。在这种情况下,代码可以保持原样(使用当然的更改)。但是我不能想到很多情况下,这就是我们想要的,所以我留下了我的第一个意见,作为实际发生的事情的一个注释,如果这不是OP想要的,那么稍后可能会避免另一个问题, statA'和'statB'正在打印相同的东西。 – jonhopkins