zoukankan      html  css  js  c++  java
  • java中的clone方法

    Java中我们可能都遇到过这样的情况,在我们将一个对象做为参数传给一个函数的时候,我们希望在这个函数中所做的操做,并不会影响到这个对象本身。但是在java传递都是引用,所以往往我们在函数内部改变了对象的某一个值,在函数外面调用该对象的时候,相应的值也同样被改变了,例如下面的程序:

    class Test

    {

    static void myMethod(Point pt1)

    {

    pt1.x = 23;

    System.out.println("x="+pt1.x);

    }

       public static void main(String[] args)

    {

    Point pt = new Point(2,4);

    System.out.println("x="+pt.x);

    myMethod(pt);

    System.out.println("x="+pt.x);

    }

    }

    class Point{

       int x,y;   

       Point (int x,int y)

       {

           this.x = x;

          this.y = y;

       }

    }

    输出的结果是

    x=2

    x=23

    x=23

    但是我们想要的结果是在我们调用了函数myMethod()方法后x的值不会改变,仍然是2。由于java中的传参是引用类型,所以会出现这样的结果,我们希望传递的是对象的一份拷贝,所以这里就用到了Object的clone()方法。

           克隆的实现需要一下几步:

    在派生类中覆盖基类的clone()方法,并声明为public。

    在派生类的clone()方法中,调用super.clone()。

    在派生类中实现Cloneable接口。Cloneable接口没有任何抽象的方法,这样的成为标识接口。实现这个接口,只是为了告诉编译器这个对象可以被克隆了。我们按照上面的步骤将上面的代码修改如下:

    class Test
    {
    static void   myMethod(Point pt1)
    {
    pt1.x = 23;
    System.out.println("x="+pt1.x);
    }
       public static void main(String[] args)
       {
      Point pt = new Point(2,4);
      System.out.println("x="+pt.x);
      Point pt2 = (Point)pt.clone();
      myMethod(pt2);
      System.out.println("x="+pt.x);
       }
    }
    class Point implements Cloneable{
       int x,y;   
       Point (int x,int y)
       {
           this.x = x;
          this.y = y;
       }
       public Object clone()
       {
      Point p = null;
      try
      {
      p = (Point)super.clone();
      }
      catch (Exception e)
      {
      e.printStackTrace();
      }
      return p;
       }
    }

    输出的结果是:

    x=2
    x=23
    x=2

    首先我们在派生类中覆盖了Object类的Clone()方法,并声明为public的。然后我们调用了super.clone()方法,这里会抛出一个异常(对于这个异常大家可以自己查看java的帮助文档),所以必须用try……catch……语句捕获,然后返回此对象。这里需要说明一下,Clone()方法返回的是Object类型的,所以需要强制类型转换

  • 相关阅读:
    51nod——1174 区间中最大的数(ST)
    「学习笔记」Ubuntu 下手动安装 Emacs
    [学习笔记] 2-SAT
    「解题报告」 [JXOI2017]数列 (DP)
    「解题报告」 [UOJ#62] 怎样跑得更快 (莫比乌斯反演)
    「学习笔记」杜教筛
    「学习笔记」Dirichlet卷积 莫比乌斯函数 莫比乌斯反演
    「学习笔记」向量外积(叉乘)
    网络流24题
    「解题报告」[网络流24题] 16.数字梯形问题 (最大费用最大流)
  • 原文地址:https://www.cnblogs.com/kexianting/p/8504890.html
Copyright © 2011-2022 走看看