当前位置:天才代写 > tutorial > JAVA 教程 > java的clone实现

java的clone实现

2017-11-13 08:00 星期一 所属: JAVA 教程 浏览:319

领略了实现clone()要领背后的所有细节后,便可建设出能利便复制的类,以便提供了一个当地副本:
 

//: LocalCopy.java
// Creating local copies with clone()
import java.util.*;

class MyObject implements Cloneable {
  int i;
  MyObject(int ii) { i = ii; }
  public Object clone() {
    Object o = null;
    try {
      o = super.clone();
    } catch (CloneNotSupportedException e) {
      System.out.println("MyObject can't clone");
    }
    return o;
  }
  public String toString() {
    return Integer.toString(i);
  }
}

public class LocalCopy {
  static MyObject g(MyObject v) {
    // Passing a handle, modifies outside object:
    v.i++;
    return v;
  }
  static MyObject f(MyObject v) {
    v = (MyObject)v.clone(); // Local copy
    v.i++;
    return v;
  }
  public static void main(String[] args) {
    MyObject a = new MyObject(11);
    MyObject b = g(a);
    // Testing handle equivalence,
    // not object equivalence:
    if(a == b) 
      System.out.println("a == b");
    else 
      System.out.println("a != b");
    System.out.println("a = " + a);
    System.out.println("b = " + b);
    MyObject c = new MyObject(47);
    MyObject d = f(c);
    if(c == d) 
      System.out.println("c == d");
    else 
      System.out.println("c != d");
    System.out.println("c = " + c);
    System.out.println("d = " + d);
  }
} ///:~

不管奈何,clone()必需可以或许会见,所以必需将其设为public(民众的)。其次,作为clone()的初期动作,应挪用clone()的基本类版本。这里挪用的clone()是Object内部预先界说好的。之所以能挪用它,是由于它具有protected(受到掩护的)属性,所以能在衍生的类里会见。
Object.clone()会查抄原先的工具有多大,再为新工具腾出足够多的内存,将所有二进制位从本来的工具复制到新工具。这叫作“按位复制”,并且按一般的想法,这个事情应该是由clone()要领来做的。但在Object.clone()正式开始操纵前,首先会查抄一个类是否Cloneable,等于否具有克隆本领——换言之,它是否实现了Cloneable接口。若未实现,Object.clone()就掷出一个CloneNotSupportedException违例,指出我们不能克隆它。因此,我们最好用一个try-catch块将对super.clone()的挪用代码困绕(或封装)起来,试图捕捉一个该当永不呈现的违例(因为这里确实已实现了Cloneable接口)。
在LocalCopy中,两个要领g()和f()展现出两种参数通报要领间的差别。个中,g()演示的是按引用通报,它会修改外部工具,并返回对谁人外部工具的一个引用。而f()是对自变量举办克隆,所以将其疏散出来,并让本来的工具保持独立。随后,它继承做它但愿的工作。甚至能返回指向这个新工具的一个句柄,并且不会对本来的工具发生任何副浸染。留意下面这个几多有些离奇的语句:
v = (MyObject)v.clone();
它的浸染正是建设一个当地副本。为制止被这样的一个语句搞夹杂,记着这种相当奇怪的编码形式在Java中是完全答允的,因为有一个名字的所有对象实际都是一个句柄。所以句柄v用于克隆一个它所指向的副本,并且最终返回指向基本范例Object的一个句柄(因为它在Object.clone()中是那样被界说的),随后必需将其造型为正确的范例。
在main()中,两种差异参数通报方法的区别在于它们别离测试了一个差异的要领。输出功效如下:
 

a == b
a = 12
b = 12
c != d
c = 47
d = 48

各人要记着这样一个事实:Java对“是否等价”的测试并差池所较量工具的内部举办查抄,从而核实它们的值是否沟通。==和!=运算符只是简朴地比拟句柄的内容。若句柄内的地点沟通,就认为句柄指向同样的工具,所以认为它们是“等价”的。所以运算符真正检测的是“由于别名问题,句柄是否指向同一个工具?”

 

    关键字:

天才代写-代写联系方式