Java 当对象包含数组时,如何重写toString方法?
在我的main方法中,我需要打印出在第二个类中创建的两个对象。这是我的密码Java 当对象包含数组时,如何重写toString方法?,java,arrays,double,tostring,Java,Arrays,Double,Tostring,在我的main方法中,我需要打印出在第二个类中创建的两个对象。这是我的密码 public String toString(){ String z = ""; for(int i = 0; i<data.length;i++){ z = z + data[i] + ", "; } return z; } 这就是我初始化数据的方式 int i=1; private double[] data =
public String toString(){
String z = "";
for(int i = 0; i<data.length;i++){
z = z + data[i] + ", ";
}
return z;
}
这就是我初始化数据的方式
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}我相信
public Stat(双[]d){
双精度[]数据=新的双精度[d.长度];
this.data=data;
在创建输入数组大小(d.length
)的新数组时导致问题,因此类中的数组不包含数据。您需要类似以下内容:
public Stat(双[]d){
这个数据=d
}
如果实例成员数据放错了位置,可以尝试使用数组.toString(statA)
。这里是您的问题:
public Stat(double[] d){
double[] data = new double[d.length];
this.data = data;
创建的数据数组是新的d.length大小数组。
在Java中,新分配的内存默认用0填充,所以这就是为什么在程序中打印这个
更改该代码,例如:
public Stat(double[] d){
this.data = d;
为什么您认为问题出在
toString
上?仅供参考:您可以将toString()
缩短为返回字符串。join(“,”,data);
如果data
是列表
(可以很容易地制作成列表)。这基本上是正确的。但是,This.data
将是对d
的引用,而不是一个单独的数组,因此在statA
构造函数之后更改内容时,statA.data
将被更改。使用单独的数组来构造statA
和statB
,显然可以避免这种情况,但是最好使用this.data=Arrays.copyOf(d,d.length)
以防万一。@jonhopkins-没错,但正如您在代码中看到的,author三次希望更改数组元素的值。复制数组显然会阻止这种情况发生,因为有各种引用。但这就是author想要的吗?当然,更改两个对象中的数据是OP想要和期望的s、 在这种情况下,代码可以保持原样(当然使用您的更改).但我想不出有多少情况需要这样做,所以我留下了我的第一条评论,作为对实际情况的说明,如果这不是OP想要的,那么它可能会避免以后的另一个问题,即为什么statA
和statB
打印相同的东西。
public Stat(double[] d){
this.data = d;