首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java :对象克隆有问题吗?

Java :对象克隆有问题吗?
EN

Stack Overflow用户
提问于 2012-08-08 20:41:04
回答 2查看 1.5K关注 0票数 0

我有invoice对象,它有两个属性,productDescriptionproductQuantity,下面是代码:

代码语言:javascript
复制
public class Invoice() implements Cloneable
{
  private String productDescription;
  private int productQuantity;

  //Getters & Setters

  public Object clone() throws CloneNotSupportedException {
     return super.clone();
  }
}

现在我想在这个类上创建对象的副本,所以我正在做

代码语言:javascript
复制
Invoice invoiceCopy = (Invoice)invoice.clone();

现在,如果我更新invoiceCopy.setProductQuanity = 10的值,那么invoice也会更新该值,但这不应该发生,有什么建议吗?

更新代码

代码语言:javascript
复制
public class Invoice implements Cloneable {
    private String productDescritpion;
    private int productQuantity;

    public String getProductDescritpion() {
        return productDescritpion;
    }

    public void setProductDescritpion(String productDescritpion) {
        this.productDescritpion = productDescritpion;
    }

    public int getProductQuantity() {
        return productQuantity;
    }

    public void setProductQuantity(int i) {
        this.productQuantity = i;
    }

    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public static void main(String[] args) {
        Invoice invoice = new Invoice();
        invoice.setProductQuantity(10);
        invoice.setProductDescritpion("nike");
        Invoice invoiceCopy = null;
        try {
            invoiceCopy = (Invoice) invoice.clone();
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        invoiceCopy.setProductQuantity(20);
        System.out.println("Invoice quantity: " + invoice.getProductQuantity());
        System.out.println("InvoiceCopy quantity: "
                + invoiceCopy.getProductQuantity());
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-08 20:49:16

默认的克隆方法是肤浅的。您必须自己编写一个新方法,或者使用一个库来实现您想要的功能(例如,请参阅apache的BeanUtils )。

如果您想要编写它,请尝试如下:

代码语言:javascript
复制
public class Invoice implements Cloneable {
private String productDescription;
private int productQuantity;

public Invoice() {
}

public Invoice(Invoice copy) {
    productDescription = copy.productDescription;
    productQuantity = copy.productQuantity;
}

public Object clone() throws CloneNotSupportedException {
    return new Invoice(this);
}

}

票数 0
EN

Stack Overflow用户

发布于 2012-08-08 20:46:36

您只是在调用clone()方法Object,它不会对您的类产生任何影响。您需要返回对象的一个新实例:

代码语言:javascript
复制
public class Invoice() implements Cloneable {
  private String productDescription;
  private int productQuantity;

  public Invoice() {

  }

  private Invoice(String productDescription, int productQuantity) {
    this.productDescription = productDescription; 
    this.productQuantity = productQuantity;

  //Getters & Setters

  public Object clone() throws CloneNotSupportedException {
     return new Invoice(productDescription, productQuantity);
  }
}

我添加了构造函数来传递参数。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11872824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档