java.lang.Object 之 clone() 使用

Java的所有类都默认继承 java.lang.Object 类,在 java.lang.Object 类中有一个方法 clone()。JDK API的说明文档解释这个方法将返回Object对象的一个拷贝。要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。
对于Java中使用 clone() 方法有几点需要注意

  1:被clone的类必须实现 Cloneable 接口,Cloneable 接口实际上是个标识接口,没有任何接口方法,如果不实现 Cloneable 接口会报 java.lang.CloneNotSupportedException。

  2:实现 Cloneable 接口的类应该使用公共方法重写 Object.clone()(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone() 方法是反射性调用的,也无法保证它将获得成功。

  3:写 clone() 方法时,通常都有一行代码 super.clone(); clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员

public class Clone implements Cloneable {

    @Override
    public Clone clone() {

        try {
            Clone clone = (Clone) super.clone();
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e);
        }
    }
}
时间: 2024-10-16 00:31:22

java.lang.Object 之 clone() 使用的相关文章

java.lang.Object 之 clone() 深拷贝,浅拷贝

当函数的参数是对象时,传递的是引用类型,在对象函数内部的操作会影响到外边对象. 如果希望传递的是对象的一个拷贝时,这时就需要用到object的clone()方法.拷贝对象返回的是一个新对象,而不是引用:拷贝对象与new操作符返回的新对象的区别就是这个拷贝对象已经包含了原来对象的一些信息,而不是对象的初始信息. 什么时候使用shallow Clone(浅拷贝,影子拷贝) ,什么时候使用 deep clone(深拷贝) :主要看具体域对象的性质是什么,如果是基本类型使用shallow clone ,

Java.lang.Object.clone()分析

首先,看一下源码: 1 public class Object { 2 protected native Object clone() throws CloneNotSupportedException; 3 } 由源代码我们会发现: 第一:Object类的clone()方法是一个native方法,native方法的效率一般来说都是远高于Java中的非native方法.这也解释了为什么要用Object中clone()方法而不是先new一个类,然后把原始对象中的信息复制到新对象中,虽然这也实现了c

Java总结篇系列:java.lang.Object

从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起. Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为, 是Java语言设计背后的思维体现. Object类位于java.lang包中,java.lang包包

java.lang.Object

java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类是Java中唯一没有父类的类. 其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法. Object类中的方法 构造方法:public Object() 文档中的类概览: Java中的每个类都具有定义在Object类中的这些方法. protected Object clone() Creates and returns

深入研究java.lang.Object类

一.概述:       Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类.      可以使用类型为Object的变量指向任意类型的对象.      Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法.      Object类的变量只能用作各种值的通用持有者.要对他们进行任何专门的操作,都需要知道它

java.lang.Object.hashCode()的返回值到底是不是对象内存地址?

刚学Java的时候我也有过这种怀疑,但一直没有验证:最近在OSCHINA上看到有人在回答问题时也这么说,于是萌生了一探究竟的想法--java.lang.Object.hashCode()的返回值到底是不是对象内存地址? (顺带回顾一下JNI) hashCode契约 说到这个问题,大家的第一反应一定和我一样--去查Object.hashCode的源码,但翻开源码,看到的却是这样的(Oracle JDK 8): /** * Returns a hash code value for the obje

研究java.lang.Object类

一.概述:        Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类.       可以使用类型为Object的变量指向任意类型的对象.       Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法.       Object类的变量只能用作各种值的通用持有者.要对他们进行任何专门的操作,都

java.lang.Object底层代码分析-jdk1.8

首先先来说明两件事情 1.后面的一些博客都会对jdk底层的方法进行一些分析,因为我个人开发了2年多,发现有很多事情还不是清楚,当我今天再好好底层源码的时候还是有不少的收获,所以和大家分    享一下,我只要参考一下相关文档 jdk1.8api:https://docs.oracle.com/javase/8/docs/api/index.html 代码下载地址:https://gitee.com/luanmihun/java-jdk-study 2.为什么要分析jdk1.8的版本,只是一些个人的

jdk源码每日一读 (一) java.lang.Object

jdk源码每日一读 (一) java.lang.Object 1. 类说明 Object是java继承体系的根,是每一个类的基类,所有的类都实现了Object类的所有方法. 2.重要方法 public final native Class<?> getClass() public native int hashCode(); public boolean equals(Object obj); protected native Object clone() throws CloneNotSup