java浅拷贝与深拷贝详解

/**

* @author MaskedMen

*java深克隆与浅克隆讲解

*技术交流群:JAVA/WEB/安卓精英群 316278345

*联系邮箱:[email protected]

*/

public class CloneDemo {

public static void main(String[] args) {

Person maskedmen1 = new Person("maskedmen1",20);

Fruit watermelon = new Fruit("西瓜",maskedmen1);

System.out.println("****************浅拷贝之基本数据类型可以改变并不影响前一个对象的属性值******************");

Person m1 = new Person("m1",21);

try {

Person m2 = (Person) m1.clone();

System.out.println("浅拷贝原始对象"+m1.toString());

//浅拷贝原始对象Person [name=m1, age=21]

System.out.println("浅拷贝后的对象"+m2.toString());

//浅拷贝后的对象Person [name=m1, age=21]

System.out.println("改变原始对象m1的年龄值:");

m1.setAge(23);

System.out.println("改变原始对象m1的年龄值m2的输出结果"+m2.toString());

//改变原始对象m1的年龄值m2的输出结果Person [name=m1, age=21]

System.out.println("改变原始对象m1的年龄值后m1对象的输出结果"+m1.toString());

//改变原始对象m1的年龄值后m1对象的输出结果Person [name=m1, age=23]

} catch (CloneNotSupportedException e1) {

e1.printStackTrace();

}

System.out.println("*************浅拷贝之子对象属于共享,改变后会影响前一个对象的属性值************");

try {

System.out.println("浅拷贝操作前的原始对象"+watermelon.toString());

//浅拷贝操作前的原始对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

Fruit potato = watermelon.clone();

System.out.println("浅拷贝的对象"+potato.toString());

//浅拷贝的对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

System.out.println("改变原始对象子类对象的值");

maskedmen1.setName("maskedmen2");

maskedmen1.setAge(22);

System.out.println("浅拷贝操作后的原始对象"+watermelon.toString());

//浅拷贝操作后的原始对象Fruit [fName=西瓜, person=Person [name=maskedmen2, age=22]]

System.out.println("原始对象改变之后的浅拷贝对象"+potato.toString());

//原始对象改变之后的浅拷贝对象Fruit [fName=西瓜, person=Person [name=maskedmen2, age=22]]

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

/* System.out.println("*****************深拷贝之原始子类对象的改变不影响拷贝对象*****************************");

try {

System.out.println("深拷贝操作前的原始对象"+watermelon.toString());

//深拷贝操作前的原始对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

Fruit potato = watermelon.clone();

System.out.println("深拷贝对象"+potato.toString());

//深拷贝对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

System.out.println("改变原始对象子类对象的值");

maskedmen1.setName("maskedmen3");

maskedmen1.setAge(23);

System.out.println("更改子类对象操作后的原始对象"+watermelon.toString());

//更改子类对象操作后的原始对象Fruit [fName=西瓜, person=Person [name=maskedmen3, age=23]]

System.out.println("更改子类对象操作后的拷贝对象"+potato.toString());

//更改子类对象操作后的拷贝对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

*/

}

}

//水果深拷贝测试类

class Fruit implements Cloneable{

private String fName;//水果名称

private Person person ;//水果所属人

/* @Override//重写clone方法 实现深拷贝

public Fruit clone() throws CloneNotSupportedException {

Fruit potato = (Fruit) super.clone();//确定要克隆的对象

potato.person=(Person) person.clone();//实现子对象的克隆

return potato;

}*/

@Override//重写clone方法 实现浅拷贝

public Fruit clone() throws CloneNotSupportedException {

return (Fruit) super.clone();

}

public Fruit() {

}

public Fruit(String fName, Person person) {

super();

this.fName = fName;

this.person = person;

}

public String getfName() {

return fName;

}

public void setfName(String fName) {

this.fName = fName;

}

public Person getPerson() {

return person;

}

public void setPerson(Person person) {

this.person = person;

}

@Override

public String toString() {

return "Fruit [fName=" + fName + ", person=" + person + "]";

}

}

//person测试类

class Person implements Cloneable{

private String name;//人的姓名

private int age;//年龄

@Override

public Object clone() throws CloneNotSupportedException {

return super.clone();

}

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = 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;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

}/**

* @author MaskedMen

*java深克隆与浅克隆讲解

*技术交流群:JAVA/WEB/安卓精英群 316278345

*联系邮箱:[email protected]

*/

public class CloneDemo {

public static void main(String[] args) {

Person maskedmen1 = new Person("maskedmen1",20);

Fruit watermelon = new Fruit("西瓜",maskedmen1);

System.out.println("****************浅拷贝之基本数据类型可以改变并不影响前一个对象的属性值******************");

Person m1 = new Person("m1",21);

try {

Person m2 = (Person) m1.clone();

System.out.println("浅拷贝原始对象"+m1.toString());

//浅拷贝原始对象Person [name=m1, age=21]

System.out.println("浅拷贝后的对象"+m2.toString());

//浅拷贝后的对象Person [name=m1, age=21]

System.out.println("改变原始对象m1的年龄值:");

m1.setAge(23);

System.out.println("改变原始对象m1的年龄值m2的输出结果"+m2.toString());

//改变原始对象m1的年龄值m2的输出结果Person [name=m1, age=21]

System.out.println("改变原始对象m1的年龄值后m1对象的输出结果"+m1.toString());

//改变原始对象m1的年龄值后m1对象的输出结果Person [name=m1, age=23]

} catch (CloneNotSupportedException e1) {

e1.printStackTrace();

}

System.out.println("*************浅拷贝之子对象属于共享,改变后会影响前一个对象的属性值************");

try {

System.out.println("浅拷贝操作前的原始对象"+watermelon.toString());

//浅拷贝操作前的原始对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

Fruit potato = watermelon.clone();

System.out.println("浅拷贝的对象"+potato.toString());

//浅拷贝的对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

System.out.println("改变原始对象子类对象的值");

maskedmen1.setName("maskedmen2");

maskedmen1.setAge(22);

System.out.println("浅拷贝操作后的原始对象"+watermelon.toString());

//浅拷贝操作后的原始对象Fruit [fName=西瓜, person=Person [name=maskedmen2, age=22]]

System.out.println("原始对象改变之后的浅拷贝对象"+potato.toString());

//原始对象改变之后的浅拷贝对象Fruit [fName=西瓜, person=Person [name=maskedmen2, age=22]]

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

/* System.out.println("*****************深拷贝之原始子类对象的改变不影响拷贝对象*****************************");

try {

System.out.println("深拷贝操作前的原始对象"+watermelon.toString());

//深拷贝操作前的原始对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

Fruit potato = watermelon.clone();

System.out.println("深拷贝对象"+potato.toString());

//深拷贝对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

System.out.println("改变原始对象子类对象的值");

maskedmen1.setName("maskedmen3");

maskedmen1.setAge(23);

System.out.println("更改子类对象操作后的原始对象"+watermelon.toString());

//更改子类对象操作后的原始对象Fruit [fName=西瓜, person=Person [name=maskedmen3, age=23]]

System.out.println("更改子类对象操作后的拷贝对象"+potato.toString());

//更改子类对象操作后的拷贝对象Fruit [fName=西瓜, person=Person [name=maskedmen1, age=20]]

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

*/

}

}

//水果深拷贝测试类

class Fruit implements Cloneable{

private String fName;//水果名称

private Person person ;//水果所属人

/* @Override//重写clone方法 实现深拷贝

public Fruit clone() throws CloneNotSupportedException {

Fruit potato = (Fruit) super.clone();//确定要克隆的对象

potato.person=(Person) person.clone();//实现子对象的克隆

return potato;

}*/

@Override//重写clone方法 实现浅拷贝

public Fruit clone() throws CloneNotSupportedException {

return (Fruit) super.clone();

}

public Fruit() {

}

public Fruit(String fName, Person person) {

super();

this.fName = fName;

this.person = person;

}

public String getfName() {

return fName;

}

public void setfName(String fName) {

this.fName = fName;

}

public Person getPerson() {

return person;

}

public void setPerson(Person person) {

this.person = person;

}

@Override

public String toString() {

return "Fruit [fName=" + fName + ", person=" + person + "]";

}

}

//person测试类

class Person implements Cloneable{

private String name;//人的姓名

private int age;//年龄

@Override

public Object clone() throws CloneNotSupportedException {

return super.clone();

}

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = 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;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

}

源码下载地址:http://pan.baidu.com/s/1o7SJoKU

时间: 2024-10-03 14:14:38

java浅拷贝与深拷贝详解的相关文章

js对象浅拷贝和深拷贝详解

js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var

Objective-C中的浅拷贝和深拷贝详解

  浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间.如: 1 2 char* str = (char*)malloc(100); char* str2 = str; 浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针. iOS 里面的浅拷贝: 在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝.他既让几个指针共用同一片内存空间,又可以在release

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

Java的位运算符详解实例

Java的位运算符详解实例——与(&).非(~).或(|).异或(^).右移(>>).左移(<<).无符号右移(>>>) 位运算符主要针对二进制, 它包括了:“与”.“非”.“或”.“异或”."右移"."左移"."无符号右移". 从表面上看似乎有点像逻辑运算符, 但逻辑运算符是针对两个关系运算符来进行逻辑运算, 而位运算符主要针对两个二进制数的位进行逻辑运算. 下面详细介绍每个位运算符. 1.与运

java中static作用详解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类

Java Service Wrapper配置详解

1 #encoding=UTF-8 2 # Configuration files must begin with a line specifying the encoding 3 # of the the file. 4 5 #******************************************************************** 6 # Wrapper License Properties (Ignored by Community Edition) 7 #*

java classLoader体系结构使用详解

原创整理不易,转载请注明出处:java classLoader体系结构使用详解 代码下载地址:http://www.zuidaima.com/share/1774052029516800.htm jvm classLoader architecture: Bootstrap ClassLoader/启动类加载器 主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. Extension ClassLoader/扩展类加载器  主要负

java.util.Scanner应用详解++扫描控制台输入

java.util.Scanner应用详解 java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地. 一.扫描控制台输入 这个例子是常常会用到,但是如果没有Scanner,你写写就知道多难受了. 当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫

Java连接SQLite数据库详解【转】

1 package com.hedalixin; 2 import java.sql.Connection; 3 import java.sql.DriverManager; 4 import java.sql.ResultSet; 5 import java.sql.Statement; 6 7 /** 8 * @author Chrome 9 * 10 */ 11 public class JavaSqlite { 12 13 /** 14 * @param args 15 */ 16 pu