谨慎重载clone方法

- public class Car implements Cloneable {
- private Object containedObj1 = new Object();
- private Object containedObj2 = new Object();
- public Object getObj1() {
- return containedObj1;
- }
- public Object getObj2() {
- return containedObj2;
- }
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return (Car) super.clone();
- }
- public Car() {
- }
- public static void main(String[] args) {
- try {
- Car obj1 = new Car();
- Car obj2 = (Car) obj1.clone();
- System.out.println("obj1 and obj2 are same:" + (obj1 == obj2));
- System.out.println("obj1.containedObj1 and obj2.containedObj1 are same:" + (obj1.getObj1() == obj2.getObj1()));
- System.out.println("obj1.containedObj2 and obj2.containedObj2 are same:" + (obj1.getObj2() == obj2.getObj2()));
- System.out.println("obj1.str and obj2.str are same:" +(obj2.getString() == obj1.getString()));
- System.out.println("obj1.data:" + obj1.getData()+"; obj2.data:" + obj2.getData());
- System.out.println("obj1.dataf:" + obj1.getDataf()+"; obj2.dataf:" + obj2.getDataf());
- } catch (CloneNotSupportedException e) {
- e.printStackTrace();
- }
- }
- }

- public class Car2 {
- private Object containedObj1 = new Object();
- private Object containedObj2 = new Object();
- private String str = "oneStr";
- private int data = 1024;
- private float dataf = 1024.1024f;
- public Car2() {
- }
- public Car2(Car2 car) {
- this.str = new String(car.getString().toString());
- this.data = car.getData();
- this.dataf = car.getDataf();
- }
- private String getString() {
- return str;
- }
- public int getData() {
- return data;
- }
- public float getDataf() {
- return dataf;
- }
- public Object getObj1() {
- return containedObj1;
- }
- public Object getObj2() {
- return containedObj2;
- }
- public static void main(String[] args) {
- Car2 obj1 = new Car2();
- Car2 obj2 = new Car2(obj1);
- System.out.println("obj1 and obj2 are same:" + (obj1 == obj2));
- System.out.println("obj1.containedObj1 and obj2.containedObj1 are same:" + (obj1.getObj1() == obj2.getObj1()));
- System.out.println("obj1.containedObj2 and obj2.containedObj2 are same:" + (obj1.getObj2() == obj2.getObj2()));
- System.out.println("obj1.str and obj2.str are same:" +(obj2.getString() == obj1.getString()));
- System.out.println("obj1.data:" + obj1.getData()+"; obj2.data:" + obj2.getData());
- System.out.println("obj1.dataf:" + obj1.getDataf()+"; obj2.dataf:" + obj2.getDataf());
- }
- }
- @Override
- protected Object clone() throws CloneNotSupportedException {
- Body newBody = (Body) super.clone();
- newBody.head = (Head) head.clone();
- return newBody;
- }
- public class Body implements Cloneable {
- public Head head;
- public Body() {
- }
- public Body(Head head) {
- this.head = head;
- }
- @Override
- protected Object clone() throws CloneNotSupportedException {
- Body newBody = (Body) super.clone();
- newBody.head = (Head) head.clone();
- return newBody;
- }
- public static void main(String[] args) throws CloneNotSupportedException {
- Body body = new Body(new Head());
- Body body1 = (Body) body.clone();
- System.out.println("body == body1 : " + (body == body1));
- System.out.println("body.head == body1.head : " + (body.head == body1.head));
- }
- }
- class Head implements Cloneable/* implements Cloneable */ {
- public Face face;
- public Head() {
- }
- public Head(Face face) {
- this.face = face;
- }
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
- class Face {
- }
- public class Body2 implements Cloneable {
- public Head head;
- public Body2() {
- }
- public Body2(Head head) {
- this.head = head;
- }
- @Override
- protected Object clone() throws CloneNotSupportedException {
- Body2 newBody = (Body2) super.clone();
- newBody.head = (Head) head.clone();
- return newBody;
- }
- public static void main(String[] args) throws CloneNotSupportedException {
- Body2 body = new Body2(new Head(new Face()));
- Body2 body1 = (Body2) body.clone();
- System.out.println("body == body1 : " + (body == body1));
- System.out.println("body.head == body1.head : " + (body.head == body1.head));
- System.out.println("body.head.face == body1.head.face : " + (body.head.face == body1.head.face));
- }
- }
- class Head implements Cloneable/* implements Cloneable */ {
- public Face face;
- public Head() {
- }
- public Head(Face face) {
- this.face = face;
- }
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
- class Face {
- }
- public final class Galaxy {
- /**
- * Regular constructor.
- */
- public Galaxy(double aMass, String aName) {
- fMass = aMass;
- fName = aName;
- }
- /**
- * Copy constructor.
- */
- public Galaxy(Galaxy aGalaxy) {
- this(aGalaxy.getMass(), aGalaxy.getName());
- //no defensive copies are created here, since
- //there are no mutable object fields (String is immutable)
- }
- /**
- * Alternative style for a copy constructor, using a static newInstance
- * method.
- */
- public static Galaxy newInstance(Galaxy aGalaxy) {
- return new Galaxy(aGalaxy.getMass(), aGalaxy.getName());
- }
- public double getMass() {
- return fMass;
- }
- /**
- * This is the only method which changes the state of a Galaxy
- * object. If this method were removed, then a copy constructor
- * would not be provided either, since immutable objects do not
- * need a copy constructor.
- */
- public void setMass(double aMass){
- fMass = aMass;
- }
- public String getName() {
- return fName;
- }
- // PRIVATE
- private double fMass;
- private final String fName;
- /** Test harness. */
- public static void main (String... aArguments){
- Galaxy m101 = new Galaxy(15.0, "M101");
- Galaxy m101CopyOne = new Galaxy(m101);
- m101CopyOne.setMass(25.0);
- System.out.println("M101 mass: " + m101.getMass());
- System.out.println("M101Copy mass: " + m101CopyOne.getMass());
- Galaxy m101CopyTwo = Galaxy.newInstance(m101);
- m101CopyTwo.setMass(35.0);
- System.out.println("M101 mass: " + m101.getMass());
- System.out.println("M101CopyTwo mass: " + m101CopyTwo.getMass());
- }
- }
- 输出结果:
- M101 mass: 15.0
- M101Copy mass: 25.0
- M101 mass: 15.0
- M101CopyTwo mass: 35.0
谨慎重载clone方法的更多相关文章
- Java中clone方法的使用
什么是clone 在实际编程过程中,我们常常要遇到这种情况:有一个对象object1,在某一时刻object1中已经包含了一些有效值,此时可能会需要一个和object1完全相同新对象object2,并 ...
- Effective Java —— 谨慎覆盖clone
本文参考 本篇文章参考自<Effective Java>第三版第十三条"Always override toString",在<阿里巴巴Java开发手册>中 ...
- Effective Java 第三版——13. 谨慎地重写 clone 方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 之-----谨慎的覆盖clone方法
1.概述 如果clone方法返回一个由构造器创建的对象,它就得到有错误的类.因此,如果覆盖了非final类中的clone方法,则应该返回一个通过调用super.clone得到的对象.如果类的所有超类都 ...
- 第十一条:谨慎的覆盖clone()方法
一个类要想实现克隆,需要实现Cloneable接口,表明这个类的对象具有克隆的功能. Cloneable接口是一个mixin接口,它里面并没有任何的抽象方法,类似的接口有Serializable接口, ...
- Java 深度克隆 clone()方法重写 equals()方法的重写
1.为什么要重写clone()方法? 答案:Java中的浅度复制是不会把要复制的那个对象的引用对象重新开辟一个新的引用空间,当我们需要深度复制的时候,这个时候我们就要重写clone()方法. 2.为什 ...
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
- Object类clone方法的自我理解
网上搜帖: clone()是java.lang.Object类的protected方法,实现clone方法: 1)类自身需要实现Cloneable接口 2)需重写clone()方法,最好设置修饰符mo ...
- PHP面向对象编程——深入理解方法重载与方法覆盖(多态)
什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面向对象语言中,接口的多种不同的实现方式即为多态.引用Charlie Calverts对多态的描述——多态性是允许你将父对 ...
随机推荐
- JAVA之路(一)
距离做下复习JAVA并学好JAVA的决定已经过去一周了,我买了慕课网的JAVA入门视频,在图书馆借了三本关于JAVA的书——两本是JAVA入门经典,一本是JAVA WEB开发宝典.我的计划是短时间内复 ...
- 1st 构建之法读后感
构建之法读后感 由于时间和书的篇幅所限,所以我没能真正通读全书,只通过网上的介绍和书内前言及目录,大概了解了构建之法是一本怎样的一本书. 这本书是由具有长达20年一线软件开发经验的邹欣老师所撰写,他以 ...
- 【Mark】Android应用开发SharedPreferences存储数据的使用方法
Android应用开发SharedPreferences存储数据的使用方法 SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的 ...
- java之静态代理与动态代理
先看看静态代理是如何操作的 定义接口: public interface Person { public void sayHello(String content, int age); public ...
- Java知识点整理(三)
如何设计出高可用的分布式架构 分布式架构 CDN简介 分布式缓存和本地缓存区别 高并发场景常用技术解决方案 JVM优化示例 Docker和JVM区别 Java开发人员需要注意的五大Docker误区 D ...
- BZOJ 1188 分裂游戏(sg函数)
如果把每堆巧克力看做一个子游戏,那么子游戏会互相影响. 如果把全部堆看做一个子游戏,那么状态又太多. 如果把每一个单独的巧克力看成一个子游戏的话,那么状态很少又不会互相影响. 令sg[i]表示一个巧克 ...
- BZOJ3811 玛里苟斯(线性基+概率期望)
k=1的话非常好做,每个有1的位都有一半可能性提供贡献.由组合数的一些性质非常容易证明. k=2的话,平方的式子展开可以发现要计算的是每一对位提供的贡献,于是需要计算每一对位被同时选中的概率.找出所有 ...
- Fdisk 分区详解
Fdisk 分区详解 来源 http://blog.itpub.net/20674423/viewspace-722812/ 1. 通过Fdisk查看系统分区详细信息: Fdi ...
- CF17E Palisection manacher
题面:洛谷(带翻译) 题解: 直接求相交不太好求,所以考虑求不相交的回文串对数. 设ll[i]表示以i为开头的回文串个数,rr[i]表示结尾<=i的回文串个数. 然后不相交的回文串对数显然就是对 ...
- Kerberos的白银票据详解
0x01白银票据(Silver Tickets)定义 白银票据(Silver Tickets)是伪造Kerberos票证授予服务(TGS)的票也称为服务票据.如下图所示,与域控制器没有AS-REQ 和 ...