浅克隆:只复制当前类的简单属性
深克隆:复制当前类中的简单属性及复杂类型属性。
可能说的不是太清楚,运行如下代码就都清楚啦!
Student.java
package
com.hitachi.clone;
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
import
java.io.IOException;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
import
java.io.Serializable;
public
class
Student
implements
Cloneable,Serializable {
/**
*
@Fields
serialVersionUID :
TODO
变量名称
*/
private
static
final
long
serialVersionUID
= 5474483935180730022L;
private
String
name;
private
Integer
age;
private
Professor
professor;
public
String getName() {
return
name
;
}
public
void
setName(String
name
) {
this.name
=
name
;
}
public
Integer getAge() {
return
age
;
}
public
void
setAge(Integer
age
) {
this.age
=
age
;
}
public
Professor getProfessor() {
return
professor
;
}
public
void
setProfessor(Professor
professor
) {
this.professor
=
professor
;
}
/**
*
*
@Description:浅克隆
*
@return: 返回结果描述
*
@return
Object: 返回值类型
*
@throws
*/
public
Object shallowClone() {
Object
o=
null;
try
{
o=
super.clone();//Object
中的clone()识别出你要复制的是哪一个对象。
}
catch(CloneNotSupportedException
e
) {
System.
out.println(e
.toString());
}
return
o
;
}
/**
*
*
@Description:深克隆
*
@return
*
@throws
IOException
*
@throws
ClassNotFoundException: 返回结果描述
*
@return
Object: 返回值类型
*
@throws
*/
public
Object deepClone()
throws
IOException, ClassNotFoundException{
ByteArrayOutputStream
out=
new
ByteArrayOutputStream();
ObjectOutputStream
oos=
new
ObjectOutputStream(out
);
oos.writeObject(
this);
ByteArrayInputStream
input=
new
ByteArrayInputStream(out.toByteArray());
ObjectInputStream
ois=
new
ObjectInputStream(input
);
return
ois
.readObject();
}
@Override
public
String toString() {
return
"Student [name="
+
name
+
", age="
+
age
+
", professor="
+
professor
+
"]"
;
}
}
Professor.java
package
com.hitachi.clone;
import
java.io.Serializable;
public
class
Professor
implements
Serializable {
/**
*
@Fields
serialVersionUID :
TODO
变量名称
*/
private
static
final
long
serialVersionUID
= -3321860827572727878L;
private
String
name;
private
Integer
age;
public
String getName() {
return
name
;
}
public
void
setName(String
name
) {
this.name
=
name
;
}
public
Integer getAge() {
return
age
;
}
public
void
setAge(Integer
age
) {
this.age
=
age
;
}
@Override
public
String toString() {
return
"Professor [name="
+
name
+
", age="
+
age
+
"]"
;
}
}
Test.java
package
com.hitachi.clone;
import
java.io.IOException;
public
class
Test {
public
static
void
main(String[]
args) {
Student
stu=
new
Student();
stu.setAge(23);
stu.setName(
"小鸟");
Professor
pro=
new
Professor();
pro.setAge(42);
pro.setName(
"大鸟");
stu.setProfessor(
pro);
Student
stu2=(Student)
stu.shallowClone();
stu2.setAge(24);
stu2.setName(
"小小");
stu2.getProfessor().setAge(43);
System.
out.println(stu
);
System.
out.println(stu2
);
Student
stu1=
new
Student();
stu1.setAge(23);
stu1.setName(
"小鸟");
Professor
pro1=
new
Professor();
pro1.setAge(42);
pro1.setName(
"大鸟");
stu1.setProfessor(
pro1);
try
{
Student
stu3
= (Student)
stu1.deepClone();
stu3.setAge(24);
stu3.setName(
"小小");
stu3.getProfessor().setAge(44);
System.
out.println(stu1
);
System.
out.println(stu3
);
}
catch
(ClassNotFoundException
e
) {
e.printStackTrace();
}
catch
(IOException
e
) {
e.printStackTrace();
}
}
}