覆盖java中的clone()函数

时间:2014-02-13 07:59:21

标签: java clone

我有一个类Stack,我在其中声明了一个Node,我需要覆盖clone()函数:

public class Stack<T> {
    public class Node<T> {
        T element;
        Node<T> next;

        public Node(T data, Node<T> n) {
            element = data;
            next = n;
        }

        @Override
        public Stack<T> clone() {
            Stack<T> temp = new Stack<T>();
            Node<T> n;
            n = top;
            if(n != null) {
                temp.push(n.element);
                while(n.next!=null) {
                    n = n.next;
                    temp.push(n.element);
                }
            }
            Stack<T> temp2 = new Stack<T>();
            while(!temp.isEmpty()) {
                temp2.push(temp.pop());
            }
            return temp2;
    }

我有其他功能,如push()和pop(),所以你可以假设它们工作正常。

问题在于,我想要做的是能够创建2个不同的堆栈对象,将一些值推入其中一个,然后将其克隆到第二个。

使用我的代码这是可能的,但是当我尝试将值推入克隆的堆栈时,它会自动将值推送到第一个堆栈中。

这是我的推动

public void push(T el) throws MyException {
    Node<T> random = null;
    Node<T> newN = new Node<T>(el, random);

    if(isEmpty()) {
        top=newN;
        newN.next = null;
    } else {
        newN.next = top; 
        Node<T> temp; 
        temp = top;
        top = newN; 
        while(temp.next!=null)
            temp = temp.next; 
        temp.next=null;
    } 
}

这是我的主要功能

的代码
public class Tester
{
  public static void main(String []args)
{
Stack<Integer> test = new Stack<Integer>();
test.push(1);
test.push(3);
System.out.println(test.toString());

Stack<Integer> test2 = new Stack<Integer>();
test2 = test.clone();
test2.push(4);

System.out.println(test2.toString());
System.out.println(test.toString());
 }
 }

如何分开此链接?

谢谢

1 个答案:

答案 0 :(得分:0)

克隆时,不仅需要创建新的Stack对象,还需要为每个元素创建一个新的Node对象。我不确定这是不是你做的,因为代码片段没有显示它。你的代码中可能只有一个拼写错误。将clone()声明为static temporary并将Stack作为参数传递,以查看代码是否合理。

如果您厌倦了克隆复杂的数据结构,那么另一个更方便的选项 - 使用普通的Java序列化序列化为字节数组,然后反序列化为新的堆栈。这被称为深度克隆。 例如,请参见this link