复制已有对象, 而又无需使代码依赖它们所属的类。
下面不是规范的克隆,这是复制
浅克隆(新属性指向原对象),深克隆
java自带,需要实现标记接口,重写clone方法。一个对象属性多指定起来麻烦会使用,不会比new有多的好处,
JDK 中的原型克隆
注意字符串不需要,因为intern得到是常量池里面的同一个字符串,克隆修改只会使得变量指向其他的常量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| package com.deltaqin.designPattern.d16_prototype;
public class CloneDemo { public static void main(String[] args) throws Exception { Person p1 = new Person(); Person p2 = (Person)p1.clone(); System.out.println(p2.age + " " + p2.score); System.out.println(p2.loc);
System.out.println(p1.loc == p2.loc); p1.loc.street = "sh"; System.out.println(p2.loc); } }
class Person implements Cloneable { int age = 8; int score = 100;
Location loc = new Location("bj", 22); @Override public Object clone() throws CloneNotSupportedException { Person p = (Person)super.clone(); p.loc = (Location)loc.clone(); return p; } }
class Location implements Cloneable { String street; int roomNo;
@Override public String toString() { return "Location{" + "street='" + street + '\'' + ", roomNo=" + roomNo + '}'; }
public Location(String street, int roomNo) { this.street = street; this.roomNo = roomNo; }
@Override public Object clone() throws CloneNotSupportedException { return super.clone(); } }
|