`
orange5458
  • 浏览: 347329 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java.lang.Object.clone() 方法

 
阅读更多

1.说明

  

protected Object clone()
                throws CloneNotSupportedException

创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。一般来说,对于任何对象 x,如果表达式:

x.clone() != x

   是正确的,则表达式:

x.clone().getClass() == x.getClass()

将为 true,但这些不是绝对条件。一般情况下是:

x.clone().equals(x)

将为 true,但这不是绝对条件。

按照惯例,返回的对象应该通过调用 super.clone 获得。如果一个类及其所有的超类(Object 除外)都遵守此约定,则 x.clone().getClass() == x.getClass()

按照惯例,此方法返回的对象应该独立于该对象(正被克隆的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被克隆对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。

Object 类的 clone 方法执行特定的克隆操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意:所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我克隆。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。

Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。

 

2.实现

   1)implements Cloneable

   2)覆盖clone方法

 public Object clone() throws CloneNotSupportedException {
          return super.clone();
 }

 

3.实质

浅复制:将对象在栈中的数据复制一份。

结果:对对象的基本类型和String(特殊的引用对象)属性变更时不影响clone对象,而对引用属性变更时会影响clone对象,所以想要实现深复制就要自己重写clone方法。

 

4.实例

 

package com.siyuan.test.clone;

class A implements Cloneable {
	public long id;

	public String name;
	
	public B b = new B();
	
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

	public String toString() {
		return "A [id=" + id + ",name=" + name + ",b=" + b + "]";
	}
}

class B implements Cloneable {
	public long id;

	public String name;
	
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

	public String toString() {
		return "B [id=" + id + ",name=" + name + "]";
	}
}

public class CloneTest {

	/**
	 * @param args
	 * @throws CloneNotSupportedException
	 */
	public static void main(String[] args) throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		A a1 = new A();
		a1.id = 1;
		a1.name = "aaa";
		a1.b.id = 2;
		a1.b.name = "bbb";
		A a2 = (A) a1.clone();
		a1.id = 3;
		a1.name = "ccc";
		a1.b.id = 4;
		a1.b.name = "ddd";
		System.out.println(a2);
		System.out.println(a1);
		
	}

}

 

5.运行结果

 

A [id=1,name=aaa,b=B [id=4,name=ddd]]
A [id=3,name=ccc,b=B [id=4,name=ddd]]

 

分享到:
评论

相关推荐

    bigcoder84#study-notes#_4Object中的clone方法1

    Object类中的clone方法clone()方法的作用克隆方法用于创建对象的拷贝,为了使用clone方法,类必须实现java.lang.Cloneable接口

    java深入理解浅拷贝和深拷贝

    拷贝对象是java中经常会遇到的问题。java中存在两种类型,基础类型和引用类型。...Object对象中提供了一个clone方法,来供我们对java对象进行拷贝。 protected native Object clone() throws CloneNot

    javabiginteger源码-Java:Java

    ##-----java.lang.Object类----- 其equals与==有没有差别? 其hashCode及clone前面有个什么修饰语? 其toString()返回什么? 其构造函数及finalize()做了什么? ##-----java.lang.Class类----- 5. 为什么说Class类不...

    Java 面试宝典

    21、写 clone()方法时,通常都有一行代码,是什么? ............................................. 16 22、面向对象的特征有哪些方面 ...........................................................................

    java面试宝典2012版.pdf

    21、写clone()方法时,通常都有一行代码,是什么? 22、面向对象的特征有哪些方面 23、java中实现多态的机制是什么? 24、abstract class和interface有什么区别? 25、abstract的method是否可同时是static,是否可...

    servlet2.4doc

    Overrides the standard java.lang.Object.clone method to return a copy of this cookie. containsHeader(String) - Method in class javax.servlet.http.HttpServletResponseWrapper The default behavior of ...

    java 面试题 总结

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    结合JVM解读浅拷贝和深拷贝

    java.lang.Cloneable和java.io.Serializable一样属于标记型接口,没有定义任何方法和属性。 一个类想要使用克隆方法 重写clone()方法,因为Object的clone()的修饰符是protected; @HotSpotIntrinsicCandidate ...

    Java面试宝典-经典

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    java面试题大全(2012版)

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    最新Java面试宝典pdf版

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    knowledge-interview:知识学习

    都在java.lang 包下 String使用final修饰,不可变,每次字符串变更都是创建新的字符串,String s = “a”+"b"除外,频繁变更会导致无引用对象过多,导致gc影响性能。 StringBuffer是线程安全的,每次变更是对本身...

    Java面试笔试资料大全

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    超级有影响力霸气的Java面试题大全文档

     java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或...

    java面试宝典2012

    21、写clone()方法时,通常都有一行代码,是什么? 16 22、面向对象的特征有哪些方面 17 23、java中实现多态的机制是什么? 18 24、abstract class和interface有什么区别? 18 25、abstract的method是否可同时是...

    jsp内置对象的用法

    page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例 序号 方 法 说 明 1 class getClass 返回此Object的类 2 int hashCode() 返回此Object的hash码 3 boolean equals...

Global site tag (gtag.js) - Google Analytics