JAVA对象克隆

摘要:
1˃ 要获得对象的副本,我们可以使用object类的clone()方法。2˃ 覆盖派生类中基类的克隆()并将其声明为公共。4˃ 在派生类中实现可克隆接口。4˃ 没有抽象方法的接口称为身份接口。在运行时,对象的clone()方法可以标识要复制的对象,为该对象分配空间,并复制对象,将原始对象的内容逐个复制到新对象空间。引用类型的克隆应使用DeeplyClone。

 

 1> 为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。

2> 在派生类中覆盖基类的clone(),并声明为public。
3> 在派生类的clone()方法中,调用super.clone()。
4> 在派生类中实现Cloneable接口。
4> 没有抽象方法的接口叫标识接口。
5> 为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object 的clone()方法能识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原 始对象的内容一一复制到新的对象空间去。

* 浅克隆是针对没有引用类型的变量来克隆。针对引用类型的克隆应该用Deeply Clone。
浅克隆:
Code:
class FleetClone
{
public static void main(String[] args)
{
   Professor p=new Professor("feiyang",23);
   Student s1=new Student("zhangshan",18,p);
   Student s2=(Student)s1.clone();
   s2.p.name="feifei";
   s2.p.age=30;
   System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
}
}
class Professor
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
}

class Student implements Cloneable
{
Professor p;
String name;
int age;
Student(String name, int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public Object clone()
{
Object o=null;
try
{
   o=super.clone();
}
catch(CloneNotSupportedException e)
{
   e.printStackTrace();
}
return o;
}
}
改变学生s2的教授信息,打印s1教授信息,结果为:name=feifei,age=30.产生这个结果是因为String是一个常量类型.

深克隆
code:
class DeeplyClone
{
public static void main(String[] args)
{
   Professor p=new Professor("feiyang",23);
   Student s1=new Student("zhangshan",18,p);
   Student s2=(Student)s1.clone();
   s2.p.name="Bill.Gates";
   s2.p.age=30;
   System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
}
}
class Professor implements Cloneable
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
public Object clone()
{
Object o=null;
try
{
   o=super.clone();
}
catch(CloneNotSupportedException e)
{
   e.printStackTrace();
}
return o;
}
}

class Student implements Cloneable
{
Professor p;
String name;
int age;
Student(String name, int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public Object clone()
{
//Object o=null;
Student o=null;
try
{
   o=(Student)super.clone();
}
catch(CloneNotSupportedException e)
{
   e.printStackTrace();
}
o.p=(Professor)p.clone();
return o;
}
}
打印结果为:name=Bill.Gates,age=30,这就是深克隆.

免责声明:文章转载自《JAVA对象克隆》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用fetch进行数据请求时报json错误flutter showModalBottomSheet max height下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Swift】UILabel的简单操作方法

@IBActionfuncbuttonClick_LabelCtrl(sender: AnyObject) { //定义CGRect来初始化UILable varframe: CGRect= CGRect(x: 50, y: 50, 200, height: 200) varlabel: UILabel= UILabel(frame: frame) //获...

Protobuf 语言指南(proto3)

Protobuf 语言指南(proto3)Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单。您可以定义数据的结构化,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语言编写和读取结构化数据。 定义消息类型 先来看一个非常简单的例子。假设你想定义一个“搜索...

Java 的设计模式之一装饰者模式

刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行为,这个类就叫装饰者类。被修饰的类叫被装饰者类,是已经存在有的功能。在装饰者类之间又可以互相装饰 特点:          1.装饰类通过构造方法来接收被装饰...

第十八节:Asp.Net Core WebApi基础总结和请求方式

一. 基础总结 1.Restful服务改造   Core下的WebApi默认也是Restful格式服务,即通过请求方式(Get,post,put,delete)来区分请求哪个方法,请求的URL中不需要写方法名。 但是我们不喜欢这种方式,所以我们将默认的路由规则 [Route("api/[controller]")] 改为: [Route("api/[con...

[Android]Android四大组件之ContentProvider

URI简介 URI(Universal Resource Identifier),又被称为"通用资源标志符"。 URI由许多部分所组成,示例及解说如下: Content URIs介绍 Android遵循URI的标准,定义了一套专用的Uri(即,Content URIs)。并且,Android提供了ContentUris、UriMatcher等类用于操作...

Android蓝牙开发技术学习总结

Android开发,提供对蓝牙的通讯栈的支持,允许设别和其他的设备进行无线传输数据。应用程序层通过安卓API来调用蓝牙的相关功能,这些API使程序无线连接到蓝牙设备,并拥有P2P或者多端无线连接的特性。 蓝牙的功能: 1、扫描其他蓝牙设备 2、为可配对的蓝牙设备查询蓝牙适配器 3、建立RFCOMM通道(其实就是尼玛的认证) 4、通过服务搜索来链接其他的设备...