当我的对象包含数组时,我该如何重写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可以在创建输入数组大小(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;
这大多是正确的。但是,'this.data'将是对'd'的引用,而不是单独的数组,因此当在statA构造函数后改变内容时,statA.data将被改变。这显然可以通过使用单独的数组来构建'statA'和'statB'来避免,但最好使用'this.data = Arrays.copyOf(d,d.length);'以防万一。 – jonhopkins
@jonhopkins - 这是真的,但正如你在代码中看到的,作者三次想要改变数组元素的值。 复制数组可以防止这种情况,这很明显,因为有各种引用。但是,作者想要什么? –
改变这两个对象中的数据当然是可能的,这是OP希望和期望的。在这种情况下,代码可以保持原样(使用当然的更改)。但是我不能想到很多情况下,这就是我们想要的,所以我留下了我的第一个意见,作为实际发生的事情的一个注释,如果这不是OP想要的,那么稍后可能会避免另一个问题, statA'和'statB'正在打印相同的东西。 – jonhopkins
为什么你认为问题是'toString'? –
仅供参考:您可以将'toString()'缩短为'返回String.join(“,”,data);'如果'data'是'List'(可以轻松制作成列表)。 –
Gavin