方法object面试题分析:7JAVA中Object的clone方法详解-克隆-深克隆
时间紧张,先记一笔,后续优化与完善。
翻开早已发黄的页张,试着寻找过去所留下的点点滴滴的足迹。多年前的好友似乎现在看来已变得陌生,匆忙之间,让这维持了多年的友谊变淡,找不出什么亲切感,只是偶尔遇上,淡淡地微笑,如今也只能在这发黄的页张中找寻过去的那些让人难忘的,至少我可以握住这仅剩下一段的“丝线头”……
package com.luzhiming.test_14; /**
* @author strungle E-mail: 645707787@QQ.com
* @version 创立时间:2013-6-23 下昼6:44:06
*
*/
public class Page14Number15 { public static void main(String[] args) throws Exception { Teacher teacherWang = new Teacher(1,"张老师"); Student p1 = new Student(1, "zhangsan");
p1.setTeacher(teacherWang); Student p2 = (Student)p1.clone();
p2.getTeacher().setName("李老师"); System.out.println(p1.getTeacher().getName());
System.out.println(p2.getTeacher().getName());
} } class Student implements Cloneable {
int age;
String name;
Teacher teacher; public Teacher getTeacher() {
return teacher;
} public void setTeacher(Teacher teacher) {
this.teacher = teacher;
} public Student(int age, String name) {
this.age = age;
this.name = 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 {
// 为什么我们第一行要调用super.clone()方法呢:
/**
* 【要想正确使用该方法:必须实现标识性接口Cloneable】 Cloneable接口中有如下详细说明: A class
* implements the Cloneable interface to indicate to the Object.clone()
* (实现Cloneable接口标明意味着Object的clone方法)
* method that it is legal for that method to make a field-for-field
* (通过属性到属性的拷贝该类的对象是合法的)
* copy of instances of that class.
*
* Invoking Object's clone method on an instance that does not implement
* (如果执行Object的clone方法在一个对象上,并且这个对象的类没有实现Cloneable接口)
* the Cloneable interface results in the exception
* (那么将会致使如下一场)
* CloneNotSupportedException being thrown.
*
* 1.首先,clone()方法是来自Object的,在Object类中,clone()是native修饰的
* 这就是说明,clone()的实现是由c或者c++来实现的,详细的实现代码我们是看不到的
*
* 2.Object 的clone方法是protected的所以我们定义的时候必定要注意将访问修饰符修改成public
*
* 3.那么调用super.clone()方法的时候都做了些什么呢? 做了这些工作:
* (1):Object的clone()方法识别你要赋值的是哪个对象,并为对象分配空间 (2):为对象的属性赋值
*
*/
Student student = (Student)super.clone();
// 【重点:这种方式是为了实现深度复制,究其原因就是,只有我们自己逐层调用clone()方法才能实现深度复制】
student.setTeacher((Teacher)student.getTeacher().clone());
return student;
} }
class Teacher implements Cloneable
{
private int age;
private String name;
public Teacher(int age, String name) {
this.age = age;
this.name = 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();
}
}
文章结束给大家分享下程序员的一些笑话语录: 马云喜欢把自己包装成教主,张朝阳喜欢把自己包装成明星,李彦宏喜欢把自己包装成的很知性,丁磊喜欢把自己包装的有创意,李开复总摆出一副叫兽的样子。看来的。其实我想说,缺啥补啥,人之常情。
---------------------------------
原创文章 By
方法和object
---------------------------------
方法object面试题分析:7JAVA中Object的clone方法详解-克隆-深克隆的更多相关文章
- 面试题:Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- CorelDRAW中如何复制对象属性详解
复制对象属性是一种比较特殊.重要的复制方法,它可以方便而快捷地将指定对象中的轮廓笔.轮廓色.填充和文本属性通过复制的方法应用到所选对象中.本教程将详解CorelDRAW中如何复制对象属性. Corel ...
- 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)
详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...
- Java 中如何使用clone()方法克隆对象?
java为什么要 对象克隆: 在程序开发时,有时可能会遇到以下情况:已经存在一个对象A,现在需要一个与A对象完全相同的B 对象,并对B 对象的属性值进行修改,但是A 对象原有的属性值不能改变.这时,如 ...
- “全栈2019”Java第九十七章:在方法中访问局部内部类成员详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- C#中的Linq to Xml详解
这篇文章主要介绍了C#中的Linq to Xml详解,本文给出转换步骤以及大量实例,讲解了生成xml.查询并修改xml.监听xml事件.处理xml流等内容,需要的朋友可以参考下 一.生成Xml 为了能 ...
- [ 转载 ] Java开发中的23种设计模式详解(转)
Java开发中的23种设计模式详解(转) 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...
- Delphi中的线程类 - TThread详解
Delphi中的线程类 - TThread详解 2011年06月27日 星期一 20:28 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本 ...
- javascript中6种基本数据类型详解
javascript中有5中数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和String,还有一种复杂数据类型——object,object本质是由一组键值 ...
随机推荐
- C# 笔试题,看你会几道题
1. Which interface you need to implement to support for each? IEnumerator IEnumerable ICompare ...
- C# 解析bt种子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...
- 使用Prism提供的类实现WPF MVVM点餐Demo
使用Prism提供的类实现WPF MVVM点餐Demo 由于公司开发的技术需求,近期在学习MVVM模式开发WPF应用程序.进过一段时间的学习,感受到:学习MVVM模式,最好的方法就是用MVVM做几个D ...
- 项目管理工具 Redmine 安装试用手记
原文:项目管理工具 Redmine 安装试用手记 项目管理工具 Redmine 安装试用手记 分类: Redmine2009-06-01 10:12 996人阅读 评论(1) 收藏 举报 项目管理工具 ...
- 经历:asp.net oracle 部署问题以及解决方法
原文:[原创]经历:asp.net oracle 部署问题以及解决方法 精简的美丽...... 一.环境 开发环境 win7 64bit Vs2010 ...
- HDU 4812 D Tree 树分区+逆+hash新位置
意甲冠军: 特定n点树 K 以下n号码是正确的点 以下n-1行给出了树的侧. 问: 所以,如果有在正确的道路点图的路径 % mod = K 如果输出路径的两端存在. 多条路径则输出字典序最小的一条. ...
- Unity SurfaceShader 开始编程
Unity SurfaceShader 开始编程 在14年年初的时候,以前给自己定下了今年要实现的三个目标.当中之中的一个就是学会编写自己的Shader,并可以投入到实际的项目应用之中.如今,转眼间日 ...
- Oracle之savepoint
Oracle之savepoint 什么是savepoint?Use the SAVEPOINT statement to identify a point in a transaction to wh ...
- Markdown 代码测试
Mou Overview Mou, the missing Markdown editor for web developers. Syntax Strong and Emphasize strong ...
- Printk 标志优先级别
#define KERN_EMERG "<0>" /* 致命级:紧急事件消息,系统崩溃之前提示,表示系统不可用 */# ...