1.对象的复制
2.clone()的使用
3.对象实例的比较
////////////////////
//
/////////////////////
1.对象的复制
-
-
Stringstr1="Thisisastring!"//这里是"对象引用"的复制
-
Stringstr2=newString(str1);//这里是"对象实例"的复制
浅复制:只复制复合对象本身.
深复制:除了复制复合对象本身,还复制了复合对象的引用的对象实例.
例如:
-
-
classPupil{
-
publicPupil(Stringsno,Stringname,intage){
-
this.sno=newString(sno);
-
this.name=newString(name);
-
this.age=age;
-
}
-
-
publicStringgetSno(){
-
returnsno;
-
}
-
-
publicStringgetName(){
-
returnname;
-
}
-
-
publicintgetAge(){
-
returnage;
-
}
-
-
publicvoidsetAge(intage){
-
this.age=age;
-
}
-
-
privateStringsno;
-
privateStringname;
-
privateintage;
- }
-
-
publicclassCopyDemo{
-
publicstaticPupil[]shallowCopy(Pupil[]aClass){
-
Pupil[]newClass=newPupil[aClass.length];
-
-
//此时newClass与aClass指向同一块内存
-
for(inti=0;i<aClass.length;i++)
-
newClass[i]=aClass[i];
-
returnnewClass;
-
}
-
-
publicstaticPupil[]deepCopy(Pupil[]aClass){
-
Pupil[]newClass=newPupil[aClass.length];
-
-
//此时newClass与aClass的相应sno,name指向同一块内存
-
for(inti=0;i<aClass.length;i++){
-
Stringsno=aClass[i].getSno();
-
Stringname=aClass[i].getName();
-
intage=aClass[i].getAge();
-
newClass[i]=newPupil(sno,name,age);
-
}
-
-
returnnewClass;
-
}
-
-
publicstaticPupil[]deeperCopy(Pupil[]aClass){
-
Pupil[]newClass=newPupil[aClass.length];
-
-
//完全的复制
-
for(inti=0;i<aClass.length;i++){
-
Stringsno=newString(aClass[i].getSno());
-
Stringname=newString(aClass[i].getName());
-
intage=aClass[i].getAge();
-
newClass[i]=newPupil(sno,name,age);
-
}
-
-
returnnewClass;
-
}
- }
2.clone()的使用
*Object.clone()
*Cloneable接口
*CloneNotSupportedException
a.使用Object.clone进行复制
两个必须条件:
1.一定要将重定义后的clone()方法定义为公有方法(在Object类中,它是受保护的成员,不能直接使用)
2.该后代类声明实现接口Cloneable接口(当类实现该接口,其任何子类也会继承该接口),该接口实际上没有任何
内容,只是一个标识,标志实现该接口的类提供clone()方法.(这是接口的一种非典型用法)
-
-
publicclassFractionimplementsCloneable{
-
publicObjectclone(){
-
try{
-
returnsuper.clone();//callprotectedmethod
-
}catch(CloneNotSupportedExceptione){
-
returnnull;
-
}
-
}
-
//othermethods...
- }
b.重写Object.clone()
例如对privatechar[]cb;characterbuffer进行复制
-
//addinclassCirbuf
-
publicObjectclone(){
-
try{
-
Cirbufcopy=(Cirbuf)super.clone();
-
copy.cb=(char[])cb.clone();
-
returncopy;
-
}catch(CloneNotSupportedExceptione){
-
thrownewInternalError(e.toString());
-
}
-
}
c.复制数组
数组是在方法调用重以引用的形式传递的对象.下述情况下非常适合引用来传递数组:
*正在接收的方法不修改数组
*正在调用的方法不必关心是否修改数组
*正在调用的方法想要得到数组中的修改结果
否则,就应该在方法调用中传递数组对象的副本.只需调用arrObj.clone()方法即可完成数组arrObj的复制操作.随后将该数组副本强制转换为其正确类型:
(type[])arrObj.clone();
System.arraycopy方法提供一种用于在数组间复制多个元素的有效方式.
System.arraycopy(source,i,target,j,len)
3.对象实例的比较
例如:
-
-
Pupilp1=newPupil("99184001","zhang3",18);
-
Pupilp2=newPupil("99184001","zhang3",18);
a."=="
if(p1==p2)...
此次测试的是对象引用,其结果肯定是false,只要两个对象引用不是互为别名就不会相等.
b.浅比较false
-
-
if(p1.getSno()==p2.getSno()&&p1.getName()==p2.getName()
-
&&p1.getAge()==p2.getAge())...;
c.深比较true[/code]
if(p1.getSno().equals(p2.getSno())&&p1.getName().equals(p2.getName())
&&p1.getAge()==p2.getAge())...;[/code]
JAVAAPI的跟类Object也提供了equals()方法,但它只是比较两个对象引用,而非比较两个对象实例.
不管怎样,如果需要比较Pupil类的对象(例如要将它们放入对象容器),应该为Pupil类重定义equals()方法:
-
-
publicbooleanequals(Objectotherobj){
-
//检查otherobj是否为空
-
if(otherobj==null)returnfalse;
-
-
//检查otherobj是否就是当前对象
-
if(otherobj==this)returntrue;
-
-
//检查otherobj是否具有正确的类型,即检查是否可与当前对象比较
-
if(!(otherobjinstanceofPupil))returnfalse;
-
-
//将otherobj转换为Pupil类的对象引用
-
PupiltmpObj=(Pupil)otherobj;
-
//关于学生是否相等的逻辑检查
-
if(sno.equals(tmpObj.sno)&&name.equals(tmpObj.name)
-
&&age==tmpObj.age)returntrue;
-
-
returnfalse;
-
}
JAVAAPI所提供的每个类几乎都提供了采用深比较策略的equals()方法,例如String类equals()方法.一般来说,用户自己定义的类也应当提供合适的equals()方法,特别是当程序要将其对象放入JAVAAPI所提供的对象容器类的时候.
按照约定,任何类所提供的equals()方法所实现的相等比较应该是等价关系,即满足自反性,对称性和传递性.另外一个类重定义了equals()方法,也应该重定义相应hashCode()方法,否则将这个类的对象放入映射对象容器时也会发生以外.
分享到:
相关推荐
在Java编程中,对象复制是一项常见的任务,特别是在处理模型(Model)和视图对象(VO)时。模型对象通常用于封装业务数据,而视图对象则用于展示这些数据。值复制,即对象属性值的复制,是保持数据一致性和简化代码...
在标题“编程语言java对象复制.pdf”和描述“编程语言java对象复制.pdf”中,明确指出了文档的主题是关于Java编程语言中对象复制的技术知识。在给出的内容部分中,通过具体的Java代码示例,讨论了在Java中实现对象...
深入 Java 虚拟机.pdf Java 虚拟机(Java Virtual Machine,JVM)是 Java 语言的 runtime 环境,是 Java 程序执行的核心组件。它提供了一个平台无关的环境,允许 Java 程序在不同的操作系统和硬件平台上运行。 一...
本文将深入探讨Java对象复制,特别是通过`clone()`方法实现的复制。 首先,我们来理解什么是对象复制。对象复制是指创建一个新对象,这个新对象与原对象具有相同的属性值。在Java中,基础类型(如int、double等)是...
在Java编程语言中,对象复制是一项常见的操作,尤其是在处理持久化对象时,为了保持数据的一致性和完整性,正确地复制对象变得尤为重要。本文将深入探讨如何利用反射机制在Java中复制一个持久化对象,理解其背后的...
### 深入Java对象及元素的存储区域 在Java平台进行软件开发的过程中,一个显著的特点是对象的创建是在程序运行时动态发生的。这也就意味着,直到程序执行时才能最终确定对象应该存放在哪个内存区域。不同的存储区域...
本文将深入探讨Java中的对象克隆,包括其原理、实现方式以及注意事项。 一、对象克隆的原理 在Java中,对象克隆可以通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来完成。`Cloneable`接口本身不包含...
首先,我们来看《深入JAVA虚拟机》这本书,它涵盖了JVM的各个关键方面,包括指令集、运行时数据区、方法区、堆内存、栈帧结构、编译与优化、异常处理和安全性等。书中通过实例解析,帮助读者理解JVM如何处理Java程序...
Java对象复制是一个重要的概念,它涉及到对象的深拷贝和浅拷贝,以及如何通过不同的方式来实现对象的复制。本文将深入分析Java中的对象复制,主要包括两种常见方法:使用`clone()`方法和通过反射机制。 1. **Object...
在Java编程中,将JSON对象转换为Java Bean对象是一个常见的任务,特别是在处理Web服务或API交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,而Java Bean是符合特定规范的Java类,通常用于...
《深入JAVA虚拟机第二版》是由Bill Venners撰写,并由曹晓钢和蒋靖翻译的中文书籍。这本书是Java开发者必备的经典读物,它详细地解析了Java虚拟机(JVM)的工作原理,帮助读者深入理解Java程序的运行机制。尽管描述...
本文将深入探讨如何使用Java实现文件及其目录结构的完整复制。 #### 一、基础知识回顾 在进行文件复制之前,我们先回顾一下Java中处理文件的基本概念: 1. **`java.io.File`**:用于表示文件或目录路径,可以获取...
《深入Java虚拟机》这本书是IT领域中关于Java虚拟机(JVM)的深度解析之作,主要聚焦于JVM的工作原理、内部结构以及优化技巧。Java虚拟机作为Java语言的核心组件,其性能直接影响到Java应用程序的运行效率。因此,对...
- 和所有Java对象一样,对象数组的元素也会在垃圾收集器的作用下自动释放内存,只要没有其他引用指向这些对象。 以上内容详细介绍了Java中对象数组的基本概念、创建、初始化、访问、修改以及与其他数据结构的比较...
深入Java虚拟机不仅有助于理解代码如何在JVM上运行,还能帮助我们优化程序性能,减少内存泄漏,提高并发能力,甚至编写更高效、安全的Java代码。通过对JVM的深入学习,开发者可以解决实际开发中的各种问题,提升自己...
以上就是《Think in Java》第11章“持有对象”中的核心知识点,理解并掌握这些概念对于深入理解和使用Java对象是非常重要的。通过实践和编程练习,你可以更好地领悟这些知识,并应用到实际项目中。
《深入Java虚拟机第二版》是一本深受Java开发者喜爱的经典著作,它详尽地剖析了Java虚拟机(JVM)的工作原理,为程序员提供了深入了解Java平台核心机制的机会。随书光盘包含了书中提及的各种示例代码、实验数据以及...
#### 四、引用的复制与对象的传递 - **引用复制**: - 当执行如 `veh2 = veh1;` 的操作时,实际上是将 `veh1` 所指向的对象地址复制给了 `veh2`,而不是复制了对象本身。这意味着 `veh1` 和 `veh2` 都指向了同一个...
在Java编程语言中,对象复制是一个常见的操作,用于创建一个现有对象的新副本。有两种主要的复制方式:浅复制(Shallow Copy)和深复制(Deep Copy)。这两种复制方法在处理对象时有不同的行为和应用场景,特别是在...
《深入JAVA虚拟机 不那么完美的第二版》这本书虽然在印刷上可能存在一些小瑕疵,但这并不影响我们从中汲取宝贵的Java虚拟机(JVM)知识。Java虚拟机是Java平台的核心组成部分,它负责执行Java程序,提供了跨平台的...