Java 堆栈类中的push()会变异堆栈中的每个元素

Java 堆栈类中的push()会变异堆栈中的每个元素,java,arrays,class,methods,stack,Java,Arrays,Class,Methods,Stack,我制作了一个基于DataRecord的堆栈数组。 这两个类编译时都没有错误,但当我将()推送到堆栈时,它会改变stackArray[]的每个索引中的数据 我找不到导致此问题的代码行。 请帮我找到原因,谢谢 数据记录类: public class DataRecord { private String id; private String data; //default constructior public DataRecord( ) {

我制作了一个基于DataRecord的堆栈数组。 这两个类编译时都没有错误,但当我将()推送到堆栈时,它会改变stackArray[]的每个索引中的数据

我找不到导致此问题的代码行。 请帮我找到原因,谢谢

数据记录类:

public class DataRecord
{
    private String id;
    private String data;

    //default constructior
    public DataRecord( )
    {
        this.id = " ";
        this.data = " ";
    }

    //overloded constructor
    public DataRecord( String id, String data )
    {
        this.id = id;
        this.data = data;
    }

    //set method
    public void setIDandData( String id, String data )
    {
        this.id = id;
        this.data = data;
    }


    //get method
    public String getID()
    {
        return id;
    }
    public String getData()
    {
        return data;
    }

    //toString
    public String toString()
    {
        return "\n Your ID is : " + id +
                "\n Your DataRecord is : " + data + "\n";
    }
}//End of DataRecord
MyStack1类:

class MyStack1
{
    private int maxSize;
    private DataRecord[] stackArray;
    private int top;
    private String tempString = "";

    public MyStack1(int sizeOfStack)
    {
        maxSize = sizeOfStack;
        stackArray = new DataRecord[maxSize];
        top = -1;
    }

    public void push( DataRecord userInput )
    {
        stackArray[++top] = userInput;
    }

    public DataRecord pop()
    {
        return stackArray[top--];
    }

    public String toString()
    {
        tempString = "";

        for(int i = 0; i <= top; i++)
        {
            tempString += i+1 + stackArray[i].toString();
        }
        return "\nThe max size of the stack is : " + maxSize +
                "\nThe top index of the stack is : " + top +
                "\nThe top element of the stack is : " + stackArray[top] +
                "\nThe list of element in the stack is : " +
                "\n" + tempString;
    }

    public static void main(String[] args)
    {
        MyStack1 stackArray = new MyStack1( 5 );

        DataRecord newData = new DataRecord(" Hello "," world! ");
        stackArray.push(newData);

        System.out.println("Results : " + stackArray.toString());

        newData.setIDandData("why","omg");
        stackArray.push( newData );

        System.out.println("Results : " + stackArray.toString());

        System.out.println("pop :"+stackArray.pop().toString());
        System.out.println("pop :"+stackArray.pop().toString());
    }
}
1类
{
私有int-maxSize;
私有数据记录[]堆栈数组;
私人int top;
私有字符串tempString=“”;
公共mystack 1(int-sizeOfStack)
{
maxSize=sizeOfStack;
stackArray=新数据记录[maxSize];
top=-1;
}
公共无效推送(DataRecord userInput)
{
stackArray[++top]=用户输入;
}
公共数据记录pop()
{
返回stackArray[top--];
}
公共字符串toString()
{
tempString=“”;
对于(int i=0;i
行
newData.setIDandData
正在修改您已经放入的对象。您必须显式地创建一个新的
DataRecord
;Java不会隐式复制对象。当您将
newData
推送到堆栈中时,它会推送对该对象的引用;在一个位置修改该对象仍会修改您需要的对象你已经放进了书堆


没有办法解决这个问题;Java就是这样工作的。

是的,我编辑了它。谢谢你指出。哦,不!有没有办法我可以在数组中分配一个对象?你刚才做了,它工作得很好。它只是不会复制对象;你必须在插入堆栈时创建新对象。你只需使用
newData=new Dat即可aRecord(“why”,“omg”)
而不是
setIDandData
。你是java之神吗?另外,我喜欢你的眼睛。是的,我是java之神。()
DataRecord newData = new DataRecord(" Hello "," world! ");
stackArray.push(newData);

System.out.println("Results : " + stackArray.toString());

newData.setIDandData("why","omg");
stackArray.push( newData );