最近在帮忙写单侧的时候,经常会和这几个对象类打交道,因为对java也不是很熟悉,刚好学习一下,都是很浅的学习,并没有深入的去学习哈,因为感觉也用不上。

  • protected Object clone() throws CloneNotSupportedException

  作用:创建并且返回一个对象的copy 

  在写单侧的时候,有的时候需要从一个已知对象创建出一个新的对象,一开始不知道,直接是用:

  

Member memberA=new Member(
"Tom",
new GregorianCalendar(1998,7,10),
Sex.MAIL,
"596156210@qq.com"
); Member memberc=memberA;

本意是想变c,而不去影响A,但是这样引用的话,很明显,改变了c也就变了,因为memberc和membera指向了一个内存地址:

System.out.println(memberA.hashCode());
System.out.println(memberc.hashCode());
//output
4558657
4558657

后来问了开发才知道这里需要copy一个对象才行,实现copy有两种办法

第一:继承Cloneable的接口

具体做法:

public class Member implements Cloneable {
public enum Sex{
MAIL,FEMAIL
} private String name;
private Calendar birthday;
private String emailaddress;
private Sex gender; public Member(String name,Calendar birthday,Sex gender,String emailaddress)
{ this.name=name;
this.birthday=birthday;
this.emailaddress=emailaddress;
this.gender=gender;
}
//继承,然后重写clone方法就可以拉
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

那么我通过clone出来的对象就和membera指向了不同的内存地址拉,具体测试:

public static void main(String[] args) throws CloneNotSupportedException {
// TODO Auto-generated method stub Member memberA=new Member(
"Tom",
new GregorianCalendar(1998,7,10),
Sex.MAIL,
"596156210@qq.com"
); Member memberc=memberA;
Member cloned=(Member)memberA.clone(); //clone的话,cloned和membera应该指向不同的内存地址,但是memberc和memberA是指向同一个地址
System.out.println(cloned.hashCode());
System.out.println(memberA.hashCode());
System.out.println(memberc.hashCode()); //相同的类,所以应该一样
System.out.println(memberA.getClass().equals(cloned.getClass())); //一个是clone,一个是引用,所以memberc 和cloned的name值应该不一样
memberc.setName("hello");
System.out.println(memberA.getName());
System.out.println(cloned.getName());
}
//output

32512553
4558657
4558657
true
hello
Tom

 

这是第一种办法,可以看到第一种办法clone的话,首先要继承外部接口,然后呢还有异常检测,另外还要对clone出来的对象Cast一下。

第二种办法的话,通过构造器来做。

    public Member(Member member) {
this.name = member.getName();
this.birthday=member.getBirthday();
this.emailaddress=member.getEmailaddress();
this.gender=member.getGender(); }

这样的话,我new出来的对象和clone出来的效果差不多。

        //通过拷贝构造器
Member membere=new Member(memberA);
System.out.println(membere.hashCode());
System.out.println(memberA.hashCode());
//output
12590745
4558657

感觉这样方便很多,不用去继承外部接口,也不用管异常,也不用cast了,写单侧的时候我肯定用第二种,毕竟还是对外部依赖少点好么

相比而言,python里面copy就简单多啦

if __name__=="__main__":
import copy
listA=[1,4,3]
copyB=copy.copy(listA)
copyB.sort()
print copyB
print listA
#output
[1, 3, 4]
[1, 4, 3]
[Finished in 0.5s]

 

java clone简单学习的更多相关文章

  1. Java注解简单学习

    注解(也被称作元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们在稍后某个时刻可以很方便的使用这些数据,其在一定程度上将元数据与源代码文件结合在一起,而不是保存在外部文档中. 注解使我们可以 ...

  2. java泛型简单学习

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: //import java.util.List; public class GenericTest { public st ...

  3. Java抽象类简单学习

    使用抽象类应该注意的几个要点: 包含一个或者多个抽象方法的类必须被声明为抽象类. 将类声明为抽象类,不一定含有抽象方法. 通常认为,在抽象类中不应该包括具体方法,建议尽量将通用的域和方法放在超类中. ...

  4. 用 Java 训练深度学习模型,原来可以这么简单!

    本文适合有 Java 基础的人群 作者:DJL-Keerthan&Lanking HelloGitHub 推出的<讲解开源项目> 系列.这一期是由亚马逊工程师:Keerthan V ...

  5. 一位资深程序员大牛给予Java初学者的学习路线建议

    java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...

  6. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  7. 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  8. 实战java虚拟机的学习计划图(看懂java虚拟机)

    啥也不说了,实战java虚拟机,好好学习,天天向上!针对自己的软肋制定学习计划. 一部分内容看完,自己做的学习笔记和感想. 学java很简单,但懂java会有难度,如果你的工资还没超过1W,那是时候深 ...

  9. Java程序员学习之路

    1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基 ...

随机推荐

  1. Android:Activity的跳转

    // 实际开发中常用的方法 Intent intent = new Intent(); intent.setClass(MainActivity.this, LoginActivity.class); ...

  2. 使用kendoui对grid指定行变色

    关键点在于绑定数据源后进行判断,可直接获取当前绑定对象的属性 dataBound: function () { dataView = this.dataSource.view(); ; i < ...

  3. 安装 chardet ,出现ImportError: No module named setuptools

    原因:在linux的机子上没有setuptools 可能此机子上的python版本过低 http://www.cnblogs.com/kkgreen/archive/2012/08/02/262042 ...

  4. Atom 编辑器插件:amWiki 轻文库

    amWiki 是一款基于 Javascript 脚本语言.依赖 Atom 编辑器.使用 Markdown 标记语法的轻量级开源 wiki 文库系统. amWiki 致力于让大家可以更简单.更便捷的建设 ...

  5. ASP.NET5 中静态文件的各种使用方式

    所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...

  6. Android基础总结(6)——内容提供器

    前面学习的数据持久化技术包括文件存储.SharedPreferences存储以及数据库存储技术保存的数据都只能被当前应用程序所访问.虽然文件存储和SharedPreferences存储中提供了MODE ...

  7. android 上传文件"Content-Type",为"application/octet-stream" 用php程序在服务端用$GLOBALS['HTTP_RAW_POST_DATA']接受(二)

    服务端php程序file_up.php function uploadFileBinary() { $this->initData(); $absoluteName = "" ...

  8. json与gson

    json:java中将json字符串转换成实体对象时,key值不能大写.将实体对象转换成json时,会默认把key值改成小写 gson:java中将json字符串转换成实体对象时,要与实体对象的字段值 ...

  9. linux程序调试常用命令

    1 调用跟踪 跟踪系统调用 strace ls –l 跟踪库调用  ltrace 2 lsof(list open file) 查看程序命令打开了哪些文件  lsof –p PID; lsof –c ...

  10. 用代码给TABLE 添加字段,设置属性并编译

    AOTTableFieldList AOTTableFieldList ,TableFieldNode; TableName tableName = "SML_InventTableExt& ...