- 浏览: 185645 次
- 性别:
- 来自: 杭州
最新评论
-
boosi:
public static void main(String[ ...
MD5 生成32位或16位字符串 -
南通ori:
还是你的对的。。。顶。。。实践出真知。
tomcat startup.bat配置JAVA_HOME -
jspc:
ok.thanks
JDK 1.6 API 官方 下载地址 -
wentao365:
明明是 32位啊。怎么是128 位呢?
怎样用java生成GUID与UUID
自 http://kuangbaoxu.iteye.com/blog/193222
.java里的clone分为:
A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。
Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。
2.在派生类的clone()方法中,调用super.clone()。
3.在派生类中实现Cloneable接口。
Object类里的clone方法是浅复制(浅克隆)
浅复制(浅克隆)的例子如下:
package com.test; //浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 //深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。 // //Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点 //1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。 //2.在派生类的clone()方法中,调用super.clone()。 //3.在派生类中实现Cloneable接口。 //<SPAN style="COLOR: red">Object类里的clone方法是浅复制(浅克隆)</SPAN>public class CloneTest { public static void main(String[] args) throws Exception{ //teacher对象将被clone出来的Student对象共享. Teacher teacher = new Teacher(); teacher.setAge(40); teacher.setName("Teacher zhang"); Student student1 = new Student(); student1.setAge(20); student1.setName("zhangsan"); student1.setTeacher(teacher); //复制出来一个对象student2 Student student2 = (Student)student1.clone(); System.out.println(student2.getAge()); System.out.println(student2.getName()); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); //修改student2的引用对象 student2.getTeacher().setAge(50); student2.getTeacher().setName("Teacher Li"); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); } } class Teacher { public int age; public String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } class Student implements Cloneable{ public int age ; public String name; public Teacher teacher; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } 输出结果为: 20 zhangsan ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang ~~~~~~~~~~~~~~~~~~~~~~ 50 Teacher Li
.java里的clone分为:
A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。
Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。
2.在派生类的clone()方法中,调用super.clone()。
3.在派生类中实现Cloneable接口。
Object类里的clone方法是浅复制(浅克隆)
浅复制(浅克隆)的例子如下:
2.深复制(深Clone)例子:
A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。
Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。
2.在派生类的clone()方法中,调用super.clone()。
3.在派生类中实现Cloneable接口。
Object类里的clone方法是浅复制(浅克隆)
浅复制(浅克隆)的例子如下:
- package com.test;
- //浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
- //深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。
- //
- //Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点
- //1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。
- //2.在派生类的clone()方法中,调用super.clone()。
- //3.在派生类中实现Cloneable接口。
- //<SPAN style="COLOR: red">Object类里的clone方法是浅复制(浅克隆)</SPAN>public class CloneTest {
- public static void main(String[] args) throws Exception{
- //teacher对象将被clone出来的Student对象共享.
- Teacher teacher = new Teacher();
- teacher.setAge(40);
- teacher.setName("Teacher zhang");
- Student student1 = new Student();
- student1.setAge(20);
- student1.setName("zhangsan");
- student1.setTeacher(teacher);
- //复制出来一个对象student2
- Student student2 = (Student)student1.clone();
- System.out.println(student2.getAge());
- System.out.println(student2.getName());
- System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
- System.out.println(student1.getTeacher().getAge());
- System.out.println(student1.getTeacher().getName());
- //修改student2的引用对象
- student2.getTeacher().setAge(50);
- student2.getTeacher().setName("Teacher Li");
- System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
- System.out.println(student1.getTeacher().getAge());
- System.out.println(student1.getTeacher().getName());
- }
- }
- class Teacher {
- public int age;
- public String name;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- class Student implements Cloneable{
- public int age ;
- public String name;
- public Teacher teacher;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Teacher getTeacher() {
- return teacher;
- }
- public void setTeacher(Teacher teacher) {
- this.teacher = teacher;
- }
- @Override
- public Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
- 输出结果为:
- 20
- zhangsan
- ~~~~~~~~~~~~~~~~~~~~~~
- 40
- Teacher zhang
- ~~~~~~~~~~~~~~~~~~~~~~
- 50
- Teacher Li
package com.test;
//浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
//深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。
//
//Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点
//1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。
//2.在派生类的clone()方法中,调用super.clone()。
//3.在派生类中实现Cloneable接口。
//<SPAN style="COLOR: red">Object类里的clone方法是浅复制(浅克隆)</SPAN>public class CloneTest {
public static void main(String[] args) throws Exception{
//teacher对象将被clone出来的Student对象共享.
Teacher teacher = new Teacher();
teacher.setAge(40);
teacher.setName("Teacher zhang");
Student student1 = new Student();
student1.setAge(20);
student1.setName("zhangsan");
student1.setTeacher(teacher);
//复制出来一个对象student2
Student student2 = (Student)student1.clone();
System.out.println(student2.getAge());
System.out.println(student2.getName());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(student1.getTeacher().getAge());
System.out.println(student1.getTeacher().getName());
//修改student2的引用对象
student2.getTeacher().setAge(50);
student2.getTeacher().setName("Teacher Li");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(student1.getTeacher().getAge());
System.out.println(student1.getTeacher().getName());
}
}
class Teacher {
public int age;
public String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student implements Cloneable{
public int age ;
public String name;
public Teacher teacher;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
输出结果为:
20
zhangsan
~~~~~~~~~~~~~~~~~~~~~~
40
Teacher zhang
~~~~~~~~~~~~~~~~~~~~~~
50
Teacher Li
2.深复制(深Clone)例子:
package com.test1; //深clone public class DeepCloneTest { public static void main(String[] args) throws Exception{ //teacher对象将不被clone出来的Student对象共享. Teacher teacher = new Teacher(); teacher.setAge(40); teacher.setName("Teacher zhang"); Student student1 = new Student(); student1.setAge(20); student1.setName("zhangsan"); student1.setTeacher(teacher); //复制出来一个对象student2 Student student2 = (Student)student1.clone(); System.out.println(student2.getAge()); System.out.println(student2.getName()); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); //修改student2的引用对象 student2.getTeacher().setAge(50); student2.getTeacher().setName("Teacher Li"); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); } } class Teacher implements Cloneable{ public int age; public String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } class Student implements Cloneable{ public int age ; public String name; public Teacher teacher; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public Object clone() throws CloneNotSupportedException { Student student = (Student)super.clone(); //将引用的对象teacher也clone下 student.setTeacher((Teacher)(student.getTeacher().clone())); return student; } } 输出结果为: 20 zhangsan ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang3.利用序列化来做深复制,把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization)过程。应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。,利用这个特性,可以做深拷贝
package com.test3; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; //利用序列化来做深复制 //深clone public class DeepCloneTest { public static void main(String[] args) throws Exception{ //teacher对象将不被clone出来的Student对象共享. Teacher teacher = new Teacher(); teacher.setAge(40); teacher.setName("Teacher zhang"); Student student1 = new Student(); student1.setAge(20); student1.setName("zhangsan"); student1.setTeacher(teacher); //复制出来一个对象student2 Student student2 = (Student)student1.deepCopy(); System.out.println(student2.getAge()); System.out.println(student2.getName()); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); //修改student2的引用对象 student2.getTeacher().setAge(50); student2.getTeacher().setName("Teacher Li"); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); } } class Teacher implements Serializable{ private static final long serialVersionUID = -8834559347461591191L; public int age; public String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } class Student implements Serializable{ //serialVersionUID 如果你的对象序列化后存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你反序列化时,就会出现Exception的,这样就会造成不兼容性的问题。 //但当serialVersionUID相同时,它就会将不一样的field以type的缺省值赋值(如int型的是0,String型的是null等),这个可以避开不兼容性的问题。所以最好给serialVersionUID赋值 private static final long serialVersionUID = 7991552226614088458L; public int age ; public String name; public Teacher teacher; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public Object deepCopy() throws Exception{ //将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝 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(); } } 输出结果为: 20 zhangsan ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang
发表评论
-
实现Comparator的比较器
2010-05-18 10:39 1051比较的对象类 class GroupInfo { ... -
jsp中影响编码的属性及其设置小结(contentType,pageEncoding,charset)
2009-12-29 17:11 989转自:http://blog.csdn.net/J ... -
一键安装双击运行——Java安装程序制作
2009-12-09 16:05 1879标 题: 一键安装双击运行——Java安装程序制作作 者: ... -
tomcat startup.bat配置JAVA_HOME
2009-07-30 17:50 11407使用zip的tomcat包,不改变系统的环境变量JAVA_HO ... -
jdk 1.5新特性说明
2009-07-27 09:37 1008自: http://pwosboy.iteye.com ... -
java---final 关键字 和 static 用法
2009-07-27 09:21 990final 关键字 和 static 用法 一、final ... -
JAVA中final修饰对象引用
2009-07-23 15:29 11105原来我错了; final 修饰的量以视为常量, ... -
js 循环table 获取input里面的属性值
2009-07-14 15:41 11634<html> <head> ... -
javascript操作表格Table
2009-07-14 11:50 1964自: http://fulong258.blog.163.co ... -
Java中获取myql数据源
2009-06-30 17:32 31141.在tomcat 中配置mysql 数据源 impo ... -
java 调用存储过程
2009-06-30 16:00 984java 调用存储过程的简单例子: public ... -
double保留两位小数(四舍五入)
2009-06-17 11:26 9479//val为处理double 数字,precsion为保留小数 ... -
Java获取各种常用时间方法
2009-06-16 20:46 974这个引用别人的一个 有 ... -
Jfig 读取文件
2009-06-10 17:41 1879Jfig 读取文件 需要导入个jar包jfig-1.5.2. ... -
JFig读取配置文件
2009-06-10 15:25 1506转自http://42087743.iteye.com/blo ... -
struts2 jar包导致的问题
2009-05-21 13:52 2717创建struts2的web工程,启动tomcat时发生如下问题 ... -
wap 开发问题笔记
2009-05-19 11:24 887本文章仅作个人开发时的笔记使用,正确与否概不关心 ****** ... -
struts2.0 displayTag
2009-05-13 17:20 1306一、最简单的情况,未使用<display:column/ ... -
MD5 生成32位或16位字符串
2009-05-07 09:13 8174package com.necsthz.questionnai ... -
怎样用java生成GUID与UUID
2009-05-06 19:47 5684GUID是一个128位长的数字,一般用16进制表示。算法 ...
相关推荐
在Java中,对象拷贝分为两种主要类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式主要区别在于如何处理对象中的引用数据类型。 首先,让我们理解Java中的引用。在Java中,基础数据类型(如int、...
为了理解深拷贝(深复制)和浅拷贝(浅复制),我们需要首先了解Java对象内存的分配方式以及引用的概念。 1. **对象复制的基础** 在Java中,当我们创建一个对象时,系统会在内存中为该对象分配一块空间,存储它的...
在Java编程中,深入理解浅拷贝和深拷贝是非常重要的概念,特别是在处理对象复制时。浅拷贝和深拷贝的区别在于复制对象时对内存中数据的处理方式。 浅拷贝(Shallow Copy)指的是创建一个新的对象,该对象与原对象...
在Java编程中,深度拷贝和浅拷贝是两种重要的对象复制方式,它们涉及到对象的内存管理和内存结构的复制。本篇文章将详细讲解如何利用Java的反射机制实现深度拷贝,以及这种方式的优点和注意事项。 首先,理解深度...
在Java编程中,深拷贝和浅拷贝是两种常见的对象拷贝方式。它们主要区别在于,浅拷贝仅复制对象本身,而不复制它引用的对象;而深拷贝则会递归地复制对象及其所有引用的对象。在某些情况下,如需要完全独立的副本时,...
当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用的对象,而深复制则会递归复制所有引用的对象。这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来...
在Java编程语言中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们涉及到内存中数据的复制和引用的处理。理解这两种拷贝方式对于开发过程中正确管理和操作对象至关重要。 浅拷贝,又...
在Java开发中,理解和掌握浅拷贝与深拷贝的概念及其实现方式是非常重要的。它们不仅关乎对象的内存管理和生命周期,也是解决复杂对象管理问题的基础。根据具体情况选择合适的拷贝策略,有助于提高程序的性能和维护性...
Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅拷贝的两种实现方法。 一、浅拷贝 浅拷贝...
这个主题涉及到Java中的浅拷贝和深拷贝概念,以及如何利用工具库如Apache Commons BeanUtils进行对象属性的便捷复制。 Apache Commons BeanUtils是一个非常实用的Java库,它提供了一系列方法来简化JavaBean的操作,...
在Java编程中,对象的复制是一个常见的操作,主要分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。本篇文章将详细讲解Java中的浅拷贝,并通过一个完整的源码示例进行性能比较。 浅拷贝是创建一个新的对象,然后...
深拷贝和浅拷贝一些例子
接下来,我们详细探讨浅拷贝和深拷贝的区别、问题所在以及如何解决。 首先,浅拷贝是指在对象复制过程中,只是简单地复制了对象的指针,而没有复制指针所指向的数据。在浅拷贝的情况下,多个对象可能会指向同一块...
根据复制的方式不同,可以分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种复制方式各有其特点和适用场景。 #### 值类型变量与引用类型变量 在深入讨论浅拷贝与深拷贝之前,我们需要先理解C#中的两种基本...
js考虑最完善的深拷贝函数,可以深拷贝引用对象和基本对象
对Python中列表和数组的赋值 中 ,浅拷贝和深拷贝的实例讲解 浅 引⽤: 列表赋值: 1234567>>> a = [1, 2, 3] >>> b = a >>> print b [1, 2, 3] >>> a[0] = 0 >>> print b [0, 2, 3] 解释:[1, 2, 3]被视作⼀个对象...
System.out.println("程序执行错误,必须输入源路径和拷贝的目标路径"); System.exit(1); } File inFile = new File(args[0]); if (!inFile.exists()) { System.out.println("源文件不存在,不能够拷贝。"); ...
在Java编程中,对象拷贝是常见的操作,主要分为两种类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式在处理对象时有着本质的区别,对于理解对象复制机制以及在实际开发中正确地复制复杂对象至关...
在Python编程语言中,"copy"模块提供了对对象复制的功能,包括浅拷贝(shallow copy)和深拷贝(deep copy)。这两种拷贝方式在处理复杂数据结构时尤为重要,因为它们之间的区别会影响到拷贝的对象及其引用。让我们...
首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含...