Java对象克隆和序列号
来源:互联网 发布:局域网行为控制软件 编辑:程序博客网 时间:2024/06/05 02:58
先用一个例子来说明假克隆吧,也就是用“=”之后的效果、。
public
class
Employee{
public
Employee(){
}
public
Employee(String name,
int
age){
this
.age = age;
this
.name = name;
}
@Override
public
String toString(){
return
"姓名: "
+ name +
"年龄: "
+ age;
}
public
String getName(){
return
name;
}
public
void
setName(String name){
this
.name = name;
}
public
int
getAge(){
return
age;
}
public
void
setAge(
int
age){
this
.age = age;
}
public
static
void
main(String[] args){
Employee demo1 =
new
Employee(
"rollen"
,
20
);
System.out.println(demo1);
Employee demo2 = demo1;
demo2.setAge(
100
);
demo2.setName(
"hello world"
);
System.out.println(demo1);
System.out.println(demo2);
}
private
String name;
private
int
age;
}
【运行结果】:
【运行结果】
姓名: rollen年龄: 20
姓名: hello world年龄: 100
姓名: hello world年龄: 100
下面看看java中的浅拷贝
对于类中的每个域,如果只包含基本类型或者不可变的引用类型,如String,或者对象在其生命周期内不会发生变化,则可以使用浅拷贝来复制对象,但是一般使用深拷贝。
class
Address{
public
Address(){
}
public
Address(String state,
int
number){
this
.number = number;
this
.state = state;
}
@Override
public
String toString(){
return
"state: "
+ state +
" munber: "
+ number;
}
public
String getState(){
return
state;
}
public
void
setState(String state){
this
.state = state;
}
public
int
getNumber(){
return
number;
}
public
void
setNumber(
int
number){
this
.number = number;
}
private
String state;
private
int
number;
}
public
class
Employee
implements
Cloneable{
public
Employee(){
}
public
Employee(String name,
int
age, Address address){
this
.address = address;
this
.age = age;
this
.name = name;
}
public
String getName(){
return
name;
}
public
void
setName(String name){
this
.name = name;
}
public
int
getAge(){
return
age;
}
public
void
setAge(
int
age){
this
.age = age;
}
public
Address getAddress(){
return
address;
}
public
void
setAddress(Address address){
this
.address = address;
}
@Override
public
String toString(){
StringBuilder sb =
new
StringBuilder();
sb.append(
"name:"
+ name +
", "
);
sb.append(
"age:"
+ age +
" \n"
);
sb.append(
"Address: "
+ address);
return
sb.toString();
}
@Override
protected
Employee clone(){
Employee employee =
null
;
try
{
employee = (Employee)
super
.clone();
}
catch
(CloneNotSupportedException e){
e.printStackTrace();
}
return
employee;
}
public
static
void
main(String[] args){
System.out.println(
"克隆之前:"
);
Address add1 =
new
Address(
"中国"
,
1
);
Employee emp1 =
new
Employee(
"rollen"
,
20
, add1);
System.out.println(emp1);
System.out.println(
"克隆之后"
);
Employee emp2 = emp1.clone();
emp2.setName(
"hello world"
);
emp2.setAge(
100
);
emp2.address.setNumber(
2
);
emp2.address.setState(
"美国"
);
System.out.println(emp1);
System.out.println(
"-----"
);
System.out.println(emp2);
}
private
String name;
private
int
age;
private
Address address;
}
【运行结果】:
克隆之前:
name:rollen, age:20
Address: state: 中国 munber: 1
克隆之后
name:rollen, age:20
Address: state: 美国 munber: 2
-----
name:hello world, age:100
Address: state: 美国 munber: 2
但是上面的主函数中的:
// emp2.address.setNumber(2);
// emp2.address.setState("美国");
替换为:
emp2.setAddress(
new
Address(
"美国"
,
2
));
运行结果为:
克隆之前:
name:rollen, age:20
Address: number: 1state中国
克隆之后
name:rollen, age:20
Address: number: 1state中国
-----
name:hello world, age:100
Address: number: 2state美国
这里我有点不明白了,为什么这种情况下克隆之后两个address会不一样呢?
谁帮忙指点一下,谢谢了、
现在看看java对象的深克隆
class
Address
implements
Cloneable{
public
Address(){
}
public
Address(String state,
int
number){
this
.number = number;
this
.state = state;
}
@Override
public
String toString(){
return
"state: "
+ state +
" munber: "
+ number;
}
@Override
protected
Address clone()
throws
CloneNotSupportedException{
Address address =
null
;
address = (Address)
super
.clone();
return
address;
}
public
String getState(){
return
state;
}
public
void
setState(String state){
this
.state = state;
}
public
int
getNumber(){
return
number;
}
public
void
setNumber(
int
number){
this
.number = number;
}
private
String state;
private
int
number;
}
public
class
Employee
implements
Cloneable{
public
Employee(){
}
public
Employee(String name,
int
age, Address address){
this
.address = address;
this
.age = age;
this
.name = name;
}
public
String getName(){
return
name;
}
public
void
setName(String name){
this
.name = name;
}
public
int
getAge(){
return
age;
}
public
void
setAge(
int
age){
this
.age = age;
}
public
Address getAddress(){
return
address;
}
public
void
setAddress(Address address){
this
.address = address;
}
@Override
public
String toString(){
StringBuilder sb =
new
StringBuilder();
sb.append(
"name:"
+ name +
", "
);
sb.append(
"age:"
+ age +
" \n"
);
sb.append(
"Address: "
+ address);
return
sb.toString();
}
@Override
protected
Employee clone(){
Employee employee =
null
;
try
{
employee = (Employee)
super
.clone();
employee.address = address.clone(); }
catch
(CloneNotSupportedException e){
e.printStackTrace();
}
return
employee;
}
public
static
void
main(String[] args){
System.out.println(
"克隆之前:"
);
Address add1 =
new
Address(
"中国"
,
1
);
Employee emp1 =
new
Employee(
"rollen"
,
20
, add1);
System.out.println(emp1);
System.out.println(
"克隆之后"
);
Employee emp2 = emp1.clone();
emp2.setName(
"hello world"
);
emp2.setAge(
100
);
emp2.setAddress(
new
Address(
"美国"
,
2
));
System.out.println(emp1);
System.out.println(
"-----"
);
System.out.println(emp2);
}
private
String name;
private
int
age;
private
Address address;
}
【运行结果】:
【运行结果】:
克隆之前:
name:rollen, age:20
Address: state: 中国 munber: 1
克隆之后
name:rollen, age:20
Address: state: 中国 munber: 1
-----
name:hello world, age:100
Address: state: 美国 munber: 2
序列化接口和对象克隆
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
import
java.io.Serializable;
class
Address
implements
Serializable{
public
Address(){
}
public
Address(String state,
int
number){
this
.number = number;
this
.state = state;
}
@Override
public
String toString(){
StringBuilder sb =
new
StringBuilder();
sb.append(
"number: "
+ number);
sb.append(
"state"
+ state +
"\n"
);
return
sb.toString();
}
public
String getState(){
return
state;
}
public
void
setState(String state){
this
.state = state;
}
public
int
getNumber(){
return
number;
}
public
void
setNumber(
int
number){
this
.number = number;
}
private
String state;
private
int
number;
}
public
class
Employee
implements
Cloneable, Serializable{
public
Employee(){
}
public
Employee(String name,
int
age, Address address){
this
.address = address;
this
.age = age;
this
.name = name;
}
public
String getName(){
return
name;
}
public
void
setName(String name){
this
.name = name;
}
public
int
getAge(){
return
age;
}
public
void
setAge(
int
age){
this
.age = age;
}
public
Address getAddress(){
return
address;
}
public
void
setAddress(Address address){
this
.address = address;
}
@Override
public
String toString(){
StringBuilder sb =
new
StringBuilder();
sb.append(
"name:"
+ name +
", "
);
sb.append(
"age:"
+ age +
" \n"
);
sb.append(
"Address: "
+ address);
return
sb.toString();
}
@Override
protected
Employee clone(){
Employee employee =
null
;
ByteArrayOutputStream baos =
new
ByteArrayOutputStream();
try
{
ObjectOutputStream oos =
new
ObjectOutputStream(baos);
oos.writeObject(
this
);
oos.close();
ByteArrayInputStream bais =
new
ByteArrayInputStream(
baos.toByteArray());
ObjectInputStream ois =
new
ObjectInputStream(bais);
employee = (Employee) ois.readObject();
ois.close();
}
catch
(Exception e){
e.printStackTrace();
}
return
employee;
}
public
static
void
main(String[] args){
System.out.println(
"克隆之前:"
);
Address add1 =
new
Address(
"中国"
,
1
);
Employee emp1 =
new
Employee(
"rollen"
,
20
, add1);
System.out.println(emp1);
System.out.println(
"克隆之后"
);
Employee emp2 = emp1.clone();
emp2.setName(
"hello world"
);
emp2.setAge(
100
);
emp2.address.setNumber(
2
);
emp2.address.setState(
"美国"
);
System.out.println(emp1);
System.out.println(
"-----"
);
System.out.println(emp2);
}
private
String name;
private
int
age;
private
Address address;
}
【运行结果】:
克隆之前:
name:rollen, age:20
Address: number: 1state中国
克隆之后
name:rollen, age:20
Address: number: 1state中国
-----
name:hello world, age:100
Address: number: 2state美国
对于任何一个序列化的对象,都必须要求实现Serializable接口。其次,如果这个类的域中也有引用对象,则也有要求这个引用类型也实现这个接口,。最后,序列化方式实现克隆效率不高,没有直接深度克隆的效率高。
- Java对象克隆和序列号
- java对象克隆(浅克隆和深克隆)
- Java(对象的深克隆和浅克隆)
- java(30) - 对象浅克隆和深克隆
- Java对象的浅克隆和深克隆
- Java对象的浅克隆和深克隆
- Java对象的浅克隆和深克隆
- Java中对象的深克隆和浅克隆
- Java中对象的深克隆和浅克隆介绍
- 浅谈java对象浅度克隆和深度克隆
- JAVA对象克隆和序列化
- 【java对象比较器和克隆】
- java对象克隆和序列化
- Java对象克隆——浅克隆和深克隆的区别
- Java对象克隆——浅克隆和深克隆的区别
- java克隆对象
- java 中克隆对象
- java中的对象克隆
- 【DP】 HDOJ 4933 Miaomiao's Function
- C++ 子类能不能改变父类中成员的访问权限?
- Eclipse与Android源码编译过程(针对如何将第三方so文件打包进apk中)
- leetcode Sort Colors
- MyBatis简单的增删改查以及简单的分页查询实现
- Java对象克隆和序列号
- HDU 1166
- 程序员如何写一份另面试官眼前一亮的简历
- 支付宝新SDK集成遇到的问题
- Ubuntu下没有语言支持Language Support
- LeetCode - Gas Station
- Android 4.4.3 应用层 Touch事件传递流程
- [2014.1.31] Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)
- CSS复习(—)