关于Java的clone()
来源:百度文库 编辑:神马文学网 时间:2024/03/29 14:45:12
相关要点:
1.必须实现Cloneable接口,这个接口只是一个标识;如果不实现,调用了clone(),运行时会报CloneNotSupportedException
2.clone是Object的方法,标识为protected,子类必须重写,标识符可改为public
3.对于jdk1.5,clone可以返回相应类的类型或Object;对于1.4,只能返回Object
4.注意深复制和浅复制
浅复制
(1)对于int,double,Double,String等基本类型,super.clone()是采用的深复制
view plaincopy to clipboardprint?
public class TestShallow implements Cloneable {
public int a;
public String b;
public Double c;
public TestShallow clone() throws CloneNotSupportedException{
return (TestShallow)super.clone();
}
}
class Test {
public static void main(String[] args) throws CloneNotSupportedException {
TestShallow a = new TestShallow();
a.a = 12;
a.b = "hahaa";
a.c = 14.11;
System.out.println("a原值");
print(a);
TestShallow b = a.clone();
b.a = 13;
b.b = "hahab";
b.c = 15.11;
System.out.println("a现值");
print(a);
System.out.println("b现值");
print(b);
}
public static void print(TestShallow a) {
System.out.println("a=" + a.a);
System.out.println("b=" + a.b);
System.out.println("c=" + a.c);
}
}
结果:
a原值
a=12
b=hahaa
c=14.11
a现值
a=12
b=hahaa
c=14.11
b现值
a=13
b=hahab
c=15.11
(2)对其他类及自定义类,默认采用的是浅复制
view plaincopy to clipboardprint?
class A {
public String a;
}
public class TestShallow1 implements Cloneable {
public int a;
public A b;
public TestShallow1() {
b = new A();
}
public TestShallow1 clone() throws CloneNotSupportedException{
return (TestShallow1)super.clone();
}
}
class Test1 {
public static void main(String[] args) throws CloneNotSupportedException {
TestShallow1 a = new TestShallow1();
a.a = 12;
a.b.a = "hahaa";
System.out.println("a原值");
print(a);
TestShallow1 b = a.clone();
b.a = 13;
b.b.a = "hahab";
System.out.println("a现值");
print(a);
System.out.println("b现值");
print(b);
}
public static void print(TestShallow1 a) {
System.out.println("a=" + a.a);
System.out.println("b=" + a.b.a);
}
}
结果:
a原值
a=12
b=hahaa
a现值
a=12
b=hahab
b现值
a=13
b=hahab
深复制
对于其中非基本类型的字段,必须明确进行其赋值
view plaincopy to clipboardprint?
class A implements Cloneable {
public String a;
public A clone() throws CloneNotSupportedException{
return (A)super.clone();
}
}
public class TestDeep implements Cloneable {
public int a;
public A b;
public TestDeep() {
b = new A();
}
public TestDeep clone() throws CloneNotSupportedException{
TestDeep clone = (TestDeep)super.clone();
clone.b = this.b.clone();
return clone;
}
}
class Test1 {
public static void main(String[] args) throws CloneNotSupportedException {
TestDeep a = new TestDeep();
a.a = 12;
a.b.a = "hahaa";
System.out.println("a原值");
print(a);
TestDeep b = a.clone();
b.a = 13;
b.b.a = "hahab";
System.out.println("a现值");
print(a);
System.out.println("b现值");
print(b);
}
public static void print(TestDeep a) {
System.out.println("a=" + a.a);
System.out.println("b=" + a.b.a);
}
}
结果:
a原值
a=12
b=hahaa
a现值
a=12
b=hahaa
b现值
a=13
b=hahab
1.必须实现Cloneable接口,这个接口只是一个标识;如果不实现,调用了clone(),运行时会报CloneNotSupportedException
2.clone是Object的方法,标识为protected,子类必须重写,标识符可改为public
3.对于jdk1.5,clone可以返回相应类的类型或Object;对于1.4,只能返回Object
4.注意深复制和浅复制
浅复制
(1)对于int,double,Double,String等基本类型,super.clone()是采用的深复制
view plaincopy to clipboardprint?
public class TestShallow implements Cloneable {
public int a;
public String b;
public Double c;
public TestShallow clone() throws CloneNotSupportedException{
return (TestShallow)super.clone();
}
}
class Test {
public static void main(String[] args) throws CloneNotSupportedException {
TestShallow a = new TestShallow();
a.a = 12;
a.b = "hahaa";
a.c = 14.11;
System.out.println("a原值");
print(a);
TestShallow b = a.clone();
b.a = 13;
b.b = "hahab";
b.c = 15.11;
System.out.println("a现值");
print(a);
System.out.println("b现值");
print(b);
}
public static void print(TestShallow a) {
System.out.println("a=" + a.a);
System.out.println("b=" + a.b);
System.out.println("c=" + a.c);
}
}
结果:
a原值
a=12
b=hahaa
c=14.11
a现值
a=12
b=hahaa
c=14.11
b现值
a=13
b=hahab
c=15.11
(2)对其他类及自定义类,默认采用的是浅复制
view plaincopy to clipboardprint?
class A {
public String a;
}
public class TestShallow1 implements Cloneable {
public int a;
public A b;
public TestShallow1() {
b = new A();
}
public TestShallow1 clone() throws CloneNotSupportedException{
return (TestShallow1)super.clone();
}
}
class Test1 {
public static void main(String[] args) throws CloneNotSupportedException {
TestShallow1 a = new TestShallow1();
a.a = 12;
a.b.a = "hahaa";
System.out.println("a原值");
print(a);
TestShallow1 b = a.clone();
b.a = 13;
b.b.a = "hahab";
System.out.println("a现值");
print(a);
System.out.println("b现值");
print(b);
}
public static void print(TestShallow1 a) {
System.out.println("a=" + a.a);
System.out.println("b=" + a.b.a);
}
}
结果:
a原值
a=12
b=hahaa
a现值
a=12
b=hahab
b现值
a=13
b=hahab
深复制
对于其中非基本类型的字段,必须明确进行其赋值
view plaincopy to clipboardprint?
class A implements Cloneable {
public String a;
public A clone() throws CloneNotSupportedException{
return (A)super.clone();
}
}
public class TestDeep implements Cloneable {
public int a;
public A b;
public TestDeep() {
b = new A();
}
public TestDeep clone() throws CloneNotSupportedException{
TestDeep clone = (TestDeep)super.clone();
clone.b = this.b.clone();
return clone;
}
}
class Test1 {
public static void main(String[] args) throws CloneNotSupportedException {
TestDeep a = new TestDeep();
a.a = 12;
a.b.a = "hahaa";
System.out.println("a原值");
print(a);
TestDeep b = a.clone();
b.a = 13;
b.b.a = "hahab";
System.out.println("a现值");
print(a);
System.out.println("b现值");
print(b);
}
public static void print(TestDeep a) {
System.out.println("a=" + a.a);
System.out.println("b=" + a.b.a);
}
}
结果:
a原值
a=12
b=hahaa
a现值
a=12
b=hahaa
b现值
a=13
b=hahab
关于Java的clone()
java的“别名”以及clone机制
JAVA中的指针,引用及对象的clone (developerworks)
JAVA中的指针,引用及对象的clone
java clone方法使用详解 - ilibaba的专栏 - CSDNBlog
java clone方法使用详解
关于java的classpath问题的总结
关于java数组的深度思考
一道关于java线程的面试题
关于XMl 的java 面试题
关于java数组的深度思考
一道关于java线程的面试题
关于JAVA软件的所有软件
三篇关于Java WebStart的文章
关于:java.lang.OutOfMemoryError
关于java.lang.OutOfMemoryError
关于:java.lang.OutOfMemoryError
关于java调用window DLL里的函数的总结
关于java的classpath问题的总结1
[设计模式]关于23种设计模式的有趣见解(转) - Java - JAVA - OpenT...
Java基础-关于session的详细解释 (2)
关于Java日期处理函数.[不断更新] - feng_sundy的专栏 - CSDNBlo...
java中关于时间日期操作的常用函数
中国Java开发网 - 关于RMI的经验总结(转贴)