package com.learn.test.others;
/**
* @功能职责: 深拷贝与浅拷贝
* @描述:
* @作者: 郭辉
* @创建时间: 2020-12-02
* @copyright Copyright (c) 2020 中国软件与技术服务股份有限公司
* @company 中国软件与技术服务股份有限公司
*/
import java.io.*;
/**
* ============================ 浅拷贝测试类 ==================================
* */
class Person implements Cloneable{
private String name ;
private int age;
private Address address;
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;
}
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Address{
private String provice;
private String city;
public String getProvice() {
return provice;
}
public void setProvice(String provice) {
this.provice = provice;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Address(String provice, String city) {
this.provice = provice;
this.city = city;
}
}
/**
* ============================ 深拷贝测试类 ==================================
* */
class DeepPerson implements Serializable,Cloneable{
private static final long serialVersionUID = 1L;
private String name ;
private int age;
private DeepAddress address;
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 DeepAddress getAddress() {
return address;
}
public void setAddress(DeepAddress address) {
this.address = address;
}
public DeepPerson(String name, int age, DeepAddress address) {
this.name = name;
this.age = age;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
/**
* 利用序列化和反序列化实现深度拷贝
* */
public Object deepClone() throws Exception{
// 序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
class DeepAddress implements Serializable{
private static final long serialVersionUID = 1L;
private String provice;
private String city;
public String getProvice() {
return provice;
}
public void setProvice(String provice) {
this.provice = provice;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public DeepAddress(String provice, String city) {
this.provice = provice;
this.city = city;
}
}
/**
* 深拷贝与浅拷贝的测试类
*
* */
public class Copy {
/**
* 浅拷贝测试,
* 浅拷贝一个对象时,对象中的属性分为进本类型和引用类型
* 对于基本类型,将其值完全复制一份
* 对于引用类型,则是将其引用对象复制一份。
* */
public static void shallowCopy() throws CloneNotSupportedException {
Person person = new Person("张三",20,new Address("河北省","张家口"));
// 浅拷贝对象
Person personClone = (Person) person.clone();
/**
* hashCode 不同,证明不是同一个对象
* */
System.out.println(person.hashCode());
System.out.println(personClone.hashCode());
/**
* 浅拷贝对象中基本类型属性一致,即浅拷贝时将基本类型属性完全复制
* */
System.out.println(person.getName());
System.out.println(personClone.getName());
/**
* 注意: 对于引用类型属性,只是复制其引用,即与被拷贝对象用的是同一个对象
* */
System.out.println(person.getAddress().getProvice());
System.out.println(personClone.getAddress().getProvice());
personClone.getAddress().setProvice("北京");
System.out.println(person.getAddress().getProvice());
System.out.println(personClone.getAddress().getProvice());
}
/**
* 深拷贝测试:
* 无论是基本数据类型,还是引用数据类型,都复制一份
* */
public static void deepCopy() throws Exception {
DeepPerson person = new DeepPerson("张三",20,new DeepAddress("河北省","张家口"));
// 深拷贝对象
DeepPerson personClone = (DeepPerson) person.deepClone();
/**
* hashCode 不同,证明不是同一个对象
* */
System.out.println(person.hashCode());
System.out.println(personClone.hashCode());
/**
* 深拷贝对象中基本类型属性一致,即浅拷贝时将基本类型属性完全复制
* */
System.out.println(person.getName());
System.out.println(personClone.getName());
/**
* 修改深拷贝对象,验证是否影响被拷贝对象
* */
System.out.println(person.getAddress().getProvice());
System.out.println(personClone.getAddress().getProvice());
personClone.getAddress().setProvice("北京");
System.out.println(person.getAddress().getProvice());
System.out.println(personClone.getAddress().getProvice());
}
public static void main(String[] args) {
/**
* 测试浅拷贝对象
* */
try {
Copy.shallowCopy();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
/**
* 测试深拷贝对象
* */
try {
Copy.deepCopy();
} catch (Exception e) {
e.printStackTrace();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
java基础补足和thinking In Java学习.rar
共23个文件
java:15个
properties:2个
xml:1个
需积分: 5 0 下载量 110 浏览量
2023-08-04
21:42:19
上传
评论
收藏 161KB RAR 举报
温馨提示
JAVA学习日记---Thinking in Java学习笔记 第5章总结 第五章 初始化与清理 5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造方法或者无参构造器。在没有其他构造方法的时候可以省略不写 需要注意的是,构造器虽然是方法但是它没有返回值。 3.使用构造器可以创建对象 关键字:new 创建对象时将在堆内存中给对象分配空间 5.2 方法重载 1. 什么是方法重载:在同一个类中,方法名相同但提供的参数个数和类型不同的两个方法叫做方法重载。 需要注意的是(返回值类型不同是不构成方法重载的) 2. 构造器也是方法,同样可以被重载 5.3 默认构造器 默认构造器又称为无参构造器,在没有其他构造器的情况下,JAVA会帮助类生成一个默认的构造器即无参构造器,可以被省略不写。 5.4 this关键字 1. this关键字可以指当前对象,即当前类的对象 2. this关键字在同一个类中可以调用构造函数,如:this()表示调用此类无参的构造函数
资源推荐
资源详情
资源评论
收起资源包目录
java基础补足和thinking In Java学习.rar (23个子文件)
java基础补足和thinking In Java学习
java历史进程.pdf 214KB
Thanking_In_Java-main
mvnw.cmd 6KB
pom.xml 2KB
src
test
java
com
learn
test
TestApplicationTests.java 213B
main
resources
application.properties 1B
java
com
learn
test
thinkInJava
chapter7
TestFinalAndStatic.java 998B
chapter4
ProcessControl.java 2KB
chapter2
javadoc.java 520B
scope.java 722B
chapter5
This.java 2KB
MethodOverLoading.java 2KB
chapter3
OperationCode.java 1KB
Alias.java 2KB
TestApplication.java 316B
others
Copy.java 7KB
InnerClass.java 3KB
Test.java 1002B
controller
test.java 478B
.mvn
wrapper
maven-wrapper.properties 218B
maven-wrapper.jar 50KB
MavenWrapperDownloader.java 5KB
mvnw 10KB
.gitignore 395B
共 23 条
- 1
资源评论
野生的狒狒
- 粉丝: 1514
- 资源: 1582
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功