`
编程足球
  • 浏览: 257849 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

java 关键字 clone

    博客分类:
  • java
阅读更多
1. 最简单的clone例子
/**
 * 
 */
package com.study.effective.clone;
/**   
 * 简单的Clone例子
 * 1. 必须实现Cloneable接口,这个类才可以调用clone方法,不然会报错
 * @className :CloneClass  
 * @package : com.study.effective 
 * @Description :最简单的Clone例子.   
 * @author:lgf   
 * @date :2012 二月 1  10:29:09          
 * @version : 1.0
 */
public class CloneClass implements Cloneable{
	// 定义测试属性
	private int intValue;
	private String strValue;
	
	public int getIntValue() {
		return this.intValue;
	}

	public void setIntValue(int intValue) {
		this.intValue = intValue;
	}

	public String getStrValue() {
		return this.strValue;
	}

	public void setStrValue(String strValue) {
		this.strValue = strValue;
	}

	/**
	 * 克隆测试
	 * 最简单的例子
	 * 就是直接调用自身的super.clone();
	 */
	public Object clone(){
		CloneClass o = null;
		try {
			o = (CloneClass)super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return o;
	}
	
	public static void main(String[] args) {
		CloneClass c1 = new CloneClass();
		c1.setIntValue(1);
		c1.setStrValue("c1 的值");
		
		CloneClass c2 = (CloneClass)c1.clone();
		c2.setIntValue(2);
		c2.setStrValue("c2 的值");
		
		System.out.println(c1.getIntValue()); 	//  1
		System.out.println(c1.getStrValue());	//  c1 的值
		System.out.println(c2.getIntValue());	//	2
		System.out.println(c2.getStrValue());	//	c2 的值
		// c1 和 c2 有不同的地址
		System.out.println(c1);//com.study.effective.clone.CloneClass@de6ced
		System.out.println(c2);//com.study.effective.clone.CloneClass@c17164
		
	}
}



2. 影子克隆
package com.study.effective.clone;

/**
* @className :UnCloneClass1  
* @package : com.study.effective.clone 
* @Description :未重载clone方法   
* @author:lgf   
* @date :2012 二月 1  11:08:26          
* @version : 1.0
 */
class UnCloneClass1{
	public String value;
}

/**   
 * 
 * @className :ShadowClone  
 * @package : com.study.effective 
 * @Description :影子克隆的例子   
 * @author:lgf   
 * @date :2012 二月 1  10:40:58          
 * @version : 1.0
 */
public class ShadowClone implements Cloneable{	
	//基本属性
	public int intValue;
	//对象属性
	public UnCloneClass1 unClass;
	
	public ShadowClone(UnCloneClass1 unClass,int intValue){
		this.unClass = unClass;
		this.intValue = intValue;
	}
	
	public Object clone(){
		ShadowClone o = null;
		try {
			o = (ShadowClone)super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return o;
	}
	
	public static void main(String[] args) {
		// 影子克隆
		UnCloneClass1 cloClass = new UnCloneClass1();
		cloClass.value = "影子克隆例子";
		ShadowClone shadowclone = new ShadowClone(cloClass,10);
		ShadowClone shadow = (ShadowClone)shadowclone.clone();
		
		// 打印值UnCloneClass1 类的 value值
		System.out.println(shadowclone.unClass.value); 	//影子克隆例子
		System.out.println(shadow.unClass.value);		//影子克隆例子
		
		shadowclone.unClass.value = "克隆类的新值";
		System.out.println(shadowclone.unClass.value); 	//克隆类的新值
		System.out.println(shadow.unClass.value);		//克隆类的新值
		
		// 查看地址
		System.out.println(shadowclone); 	//effective.clone.ShadowClone@c17164
		System.out.println(shadow); 		//effective.clone.ShadowClone@1fb8ee3
		
		//effective.clone.UnCloneClass1@61de33 两个类的unClass 属性指向同一个地址
		System.out.println(shadowclone.unClass); 
		System.out.println(shadow.unClass);
	}
}



3. 深度克隆
package com.study.effective.clone;

/**
* @className :UnCloneClass2  
* @package : com.study.effective.clone 
* @Description :实现重载clone 方法的对象 
* @author:lgf   
* @date :2012 二月 1  11:10:31          
* @version : 1.0
 */
class UnCloneClass2 implements Cloneable{
	public String value;
	/**
	 * 类本身重载clone方法
	 */
	public Object clone(){
		UnCloneClass2 o = null;
		try {
			o = (UnCloneClass2)super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return o;
	}
}
/**   
 * 
 * @className :DepthClone  
 * @package : com.study.effective 
 * @Description :深度克隆   
 * @author:lgf   
 * @date :2012 二月 1  10:59:17          
 * @version : 1.0
 */
public class DepthClone implements Cloneable{
	public int intValue;
	public UnCloneClass2 unClass;
	
	public DepthClone(UnCloneClass2 unClass,int intValue){
		this.unClass = unClass;
		this.intValue = intValue;
	}
	
	public Object clone(){
		DepthClone o = null;
		try {
			o = (DepthClone)super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		o.unClass = (UnCloneClass2)unClass.clone();
		return o;
	}
	
	public static void main(String[] args) {
		// 影子克隆
		UnCloneClass2 cloClass = new UnCloneClass2();
		cloClass.value = "影子克隆例子";
		DepthClone depthClone = new DepthClone(cloClass,10);
		DepthClone depth = (DepthClone)depthClone.clone();
		
		// 打印值UnCloneClass1 类的 value值
		System.out.println(depthClone.unClass.value); 	//影子克隆例子
		System.out.println(depth.unClass.value);		//影子克隆例子
		
		depthClone.unClass.value = "克隆类的新值";
		System.out.println(depthClone.unClass.value); 	//克隆类的新值
		System.out.println(depth.unClass.value);		//影子克隆例子
		
		// 查看地址
		System.out.println(depthClone); 	//effective.clone.ShadowClone@c17164
		System.out.println(depth); 		//effective.clone.ShadowClone@1fb8ee3
		
		// 指向不同的地址
		System.out.println(depthClone.unClass);  //effective.clone.UnCloneClass2@61de33
		System.out.println(depth.unClass);		//effective.clone.UnCloneClass2@14318bb

	}
}


分享到:
评论

相关推荐

    java中的指针,引用及对象的clone

    在Java中,当使用`new`关键字创建一个对象时,实际上创建的是一个指向该对象的引用。例如,以下代码创建了一个`PassObj`对象,并通过`objA`引用该对象: ```java PassObj objA = new PassObj(); ``` 这里的`objA`...

    java中关键字Object详解

    Java中的`Object`类是所有类的根,这意味着无论你定义的任何自定义类,如果没有显式地声明继承自其他类,那么它们都会隐式地继承`Object`类。`Object`类提供了基本的方法,这些方法是所有Java对象共有的。下面我们将...

    Java中的final关键字

    在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来定义不可变性和唯一性。这个关键字可以应用于变量、方法和类,分别赋予它们不同的特性。以下是对`final`关键字在不同场景下使用的详细介绍: 1....

    java object 之clone方法全面解析

    1. **native关键字**:`native`表示这个方法是一个本地方法,它的实现是在Java虚拟机(JVM)之外,通常用C或C++编写,然后通过JNI(Java Native Interface)进行调用。由于`clone()`方法是本地方法,它的执行速度...

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    ### Java 高级特性详解 #### 一、`hashCode` ...正确地重写 `equals` 和 `hashCode` 方法、使用 `Comparator` 进行排序、利用反射机制和序列化技术,以及实现 `clone` 方法都是开发高质量 Java 应用程序的重要技能。

    Java教程.doc

    Java基础知识 ...本文档对Java的基础知识进行了详细的介绍,包括基本类型、static关键字、final关键字、赋值、指派、别名、控制程序流程等知识点。这些知识点是Java开发的基础,也是Java开发者必须掌握的知识。

    Java面试宝典2013最新版

    7. Java的clone()方法在实现时,通常会有一行代码是调用super.clone()。 8. 面向对象编程的三大特性:封装、继承、多态,是Java语言的核心知识点。 9. Java中的多态实现机制是通过方法重载(Overloading)和方法...

    Java面试指南.pdf

    - Java创建对象的方式:可以通过new关键字直接创建,也可以通过反射机制、clone方法或反序列化等方式创建。 - 序列化和反序列化:序列化是将对象的状态信息转换为可以存储或传输的形式的过程,反序列化则是把序列...

    java面试100题

    本资源摘要信息涵盖 Java 面试的多个方面,包括 Java 的基础知识、对象的创建和使用、关键字解释、反射机制、基本数据类型、字符串操作、Servlet 生命周期等。 一、Java 面试 100 题 Java 面试 100 题涵盖了 Java ...

    JAVA创建对象的四种方法

    - 使用 new 语句创建对象是 Java 中最常见的创建对象的方法,它可以直接在 Java 代码中使用 new 关键字来创建对象,如 `Person p1 = new Person("王豪博", 25);` - 使用反射机制创建对象是指使用 Java 的反射机制来...

    Java面试问题带答案40道.docx

    33. Java 中的 volatile 关键字有什么作用?答:volatile 关键字用于修饰变量,确保多个线程之间共享变量的可见性和同步性,防止出现数据不一致的问题。34. Java 中的 synchronized 关键字有何用途?答:...

    达内Java1609班第一次月考.pdf

    Java中的标识符有多种规则,例如不能以数字开头、不能使用Java关键字等。例如,_mem、M12、$12都是合法的标识符,而12a、1_file是不合法的。 六、JDK工具 JDK工具包括 javac.exe、java.exe 等,其中 javac.exe 是 ...

    JAVA版数据结构.pdf

    文档中提到了在`clone()`方法中的异常处理,这表明文档可能涉及Java中的异常处理机制,包括`try`、`catch`、`finally`和`throw`关键字的使用。 11. Java类的继承和接口 文档提到了`implements`关键字,这涉及到Java...

    2022年JAVA考试试题及答案.docx

    * 访问修饰符是指 JAVA 语言中用于控制访问权限的关键字,包括 public、private、protected 和 default 等。 * 访问修饰符的作用范围从大到小依次是:public、protected、default、私有。 * 访问修饰符的使用可以...

    Java面试小抄第一版 By 库森.pdf

    16. Java对象创建方式:构造器、反射、clone、反序列化。 17. 不可变对象定义:一旦创建,其状态不可更改的对象。 18. 值传递和引用传递的区别:Java只存在值传递,传递的是对象引用的副本。 字符串和类特性: 19....

    Java面试葵花宝典

    Java中,synchronized关键字用于实现线程同步,而volatile关键字则保证了变量的可见性。多线程可以使用继承Thread类或者实现Runnable接口来实现。sleep()和wait()都是使当前线程暂停执行的方法,但wait()需要在同步...

    java语言程序设计 java编程笔记 由浅入深的笔记 共32份 全套资源.rar

    java基础关键字.docx java命名和数据类型.docx java序列化.docx Math类.docx Object(对象).docx operator(运算符).docx Properties.docx return语句的例子.docx Scanner和if语法.docx static.docx 毕向东视频的...

Global site tag (gtag.js) - Google Analytics