`
endual
  • 浏览: 3566891 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java基础 克隆的应用

    博客分类:
  • java
 
阅读更多

好吧,我先来说,这个不知道再实际的开发中用的大不大。

 

克隆分为浅克隆和深克隆,两者的区别就是克隆后的对象,修改对象中引用的属性的时候,是不是会影响到原来的那个对象。

恩,你一定很糊涂了。

 

 

首先来说浅克隆:

我有一个people类,里面有三个属性,一个是学号,一个名字,一个是身份证,身份证又是一个类,里面有两个属性一个是

身份证号码,一个身份证的发证机关的名字。

 

我首先创建了一个people对象,然后我克隆一份,那么这一份是和克隆前的对象有相同的属性值得。但是如果我改变了people的引用对象的属性值,两个都会是影响到得,而改变的基本类型的,8个基本类型的话,是不会影响到的。

 

 

克隆的实现要实现一个接口,然后覆盖clone的方法就可以了的。

 

 

创建一个people并且实现接口,接口是定义型的接口,并不须要实现一些方法的:

 

 

 

card类:

 

 

package endual.copy;

public class Card {

	
	private int id ;
	private String name ;
	public Card(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
//	public Object clone() throws CloneNotSupportedException {
//		
//		Object obj = super.clone() ;
//		return obj ;
//		
//	}
	
	
	
}
 

 

 

 

 

People.java

package endual.copy;

public class People implements Cloneable{

	private int id ;
	private String name ;
	
	private Card card ;

	public People(int id, String name, Card card) {
		super();
		this.id = id;
		this.name = name;
		this.card = card;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Card getCard() {
		return card;
	}

	public void setCard(Card card) {
		this.card = card;
	}
	
	public Object clone() {
		Object object = null;
		try {
			object = super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return object ;
	}
	
	
}
 
//我们要实现的就是这个方法,然后用clone的方法就可以了,就是克隆这个people了
public Object clone() {
		Object object = null;
		try {
			object = super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return object ;
	}

 

 

main类

package endual.copy;
/**
 * 深克隆的概念
 * 深复制或者叫深克隆:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。
 * 那些引用其他对象的变量将指向被复制过的新对象,而不在是原来有的那些被引用的对象。换言之,深复制把要复制的对象
 * 所引用的对象都复制了一遍。也就是说,我复制的对象改变的话,是不会影响到我原来引用的对象的。
 *
 */
public class CloneAoo {
	
	public static void main(String[] args) {
		Card card = new Card (123456, "浙江杭州派出所") ;
		People p = new People(98765,"xxx", card) ;
		
                People pp = (People) p.clone() ; //克隆了一个pp对象,但是里面有一个引用的是card的,而其他是基本类型的

		System.out.println(pp.getCard().getName()) ; //打印是一样的
		System.out.println(pp.getCard().getId());     //打印是一样的
		
		pp.getCard().setName("中国建设银行"); //改变掉card的属性
		pp.setId(33) ; //改变掉基本的属性
		System.out.println(p.getCard().getName()); //打印p对象的引用card的值就变了
		System.out.println(p.getId()); //这个没变化

		
		
		
		//Clone clone = new Clone() ;
		
	}

}

 

结果分析:

 

杭州派出所
123456
中国建设银行
98765

 

浅克隆可以理解为克隆的对象如果里面有引用的属性的话,那么用的是同一份属性的值,如果改变掉其中一份的属性值得话,就会影响到其他的对象的引用的。

--------------------------------------------------------------------

 

而可能就是完全的克隆一份了,互不相关的一份克隆了的。

这个要用的序列化了,首先将对象序列化到文件或者xml,然后再反序列化回来,这样就是一个新的对象了,里面的引用是新创建的。

还有一种复制就是将引用也复制一份就可以了

 

要么我们也要实现card的clone的克隆的方法:

 

package endual.copy;

public class Card implements Cloneable{

	
	private int id ;
	private String name ;
	public Card(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public Object clone() throws CloneNotSupportedException {
		
		Object obj = super.clone() ;
		return obj ;
		
	}
	
	
	
}
 

 

 

people类

package endual.copy;

public class People implements Cloneable{

	private int id ;
	private String name ;
	
	private Card card ;

	public People(int id, String name, Card card) {
		super();
		this.id = id;
		this.name = name;
		this.card = card;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Card getCard() {
		return card;
	}

	public void setCard(Card card) {
		this.card = card;
	}
	
	public Object clone() throws CloneNotSupportedException {
		
		People pp = (People)super.clone() ;
		pp.setCard((Card)pp.getCard().clone()) ;
		return pp;
	}
	
	
}
 

main类

package endual.copy;
/**
 * 深克隆的概念
 * 深复制或者叫深克隆:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。
 * 那些引用其他对象的变量将指向被复制过的新对象,而不在是原来有的那些被引用的对象。换言之,深复制把要复制的对象
 * 所引用的对象都复制了一遍。也就是说,我复制的对象改变的话,是不会影响到我原来引用的对象的。
 *
 */
public class CloneAoo {
	
	public static void main(String[] args) throws CloneNotSupportedException {
		Card card = new Card (123456, "杭州派出所") ;
		People p = new People(98765,"xxx", card) ;
		People pp = (People) p.clone() ;
		System.out.println(pp.getCard().getName()) ;
		System.out.println(pp.getCard().getId());
		
		pp.getCard().setName("中国建设银行");
		pp.setId(33) ;
		System.out.println(p.getCard().getName());
		System.out.println(p.getId());
		Object obj = new Object() ;
		
		
		
		//Clone clone = new Clone() ;
		
	}

}

 

 

测试结果是:

 

杭州派出所
123456
杭州派出所
98765

 并没有改变原来的值了

 

 

 

 

 

 

分享到:
评论

相关推荐

    Avion v1.7 -社交音频应用程序克隆俱乐部社交网络Android应用程序Java源码

    Avion v1.7 -社交音频应用程序克隆俱乐部社交网络Android应用程序Java源码 会所已被重新定义,增加了许多变化,并不断更新。codecanyon上提供的音频应用程序的最佳解决方案。Admob和Inapp购买的想法已被添加到货币化...

    Java基础知识点汇总

    ### Java基础知识点汇总 ...以上内容总结了Java基础知识点汇总中的一些核心概念,涵盖了变量的存储位置、泛型的基础、静态变量的应用场景、克隆机制以及数组的基本特性。这些知识点对于理解和使用Java语言至关重要。

    【java系列文章】java 基础知识

    【Java系列文章】Java 基础知识涵盖了Java开发中的核心概念和常见问题,以下是针对这些知识点的详细解析: ...以上就是Java基础知识的详细解读,涵盖了从基础到进阶的多个方面,有助于深入理解Java编程的核心概念。

    Java经典编程源码基础例程300.zip

    第3章 Java语言基础 15 实例011 输出错误信息与调试信息 16 实例012 从控制台接收输入字符 16 实例013 重定向输出流实现程序日志 17 实例014 自动类型转换与强制类型转换 19 实例015 加密可以这样简单(位运算) 20 ...

    JAVA基础全面知识点

    Java是世界上最流行的编程语言...掌握这些Java基础知识点,将为后续的Java编程打下坚实的基础,无论是开发简单的应用程序还是复杂的分布式系统。通过不断的实践和学习,你可以深入理解这些概念并灵活运用到实际项目中。

    java基础面试题.doc

    《Java基础面试题解析》 Java作为一门强大的面向对象编程语言,其基础面试题涵盖了众多关键概念,包括面向对象特性、内存管理、类与对象、数据类型、方法重载与覆盖等。本文将深入探讨这些知识点,帮助你更好地理解...

    java面试大全,从java基础到微服务完整版

    #### 一、Java基础 ##### 1. `static` 关键字的意义 - **定义**:`static` 是一个关键字,用于标记类的成员变量或方法,表明它们属于类级别而非实例级别。这意味着即使没有创建类的实例,也能通过类名直接访问这些...

    java ee练习代码,基础语法+高级特性 Java学习资料

    Java EE,全称为Java Platform, Enterprise Edition,是Java平台针对企业级应用开发的一套标准规范。这个标准由Java Community Process(JCP)制定,旨在提供一个用于构建分布式、多层企业应用程序的框架。Java EE...

    Java入门到精通完整教程+源码.zip

    Java编程语言是软件开发领域广泛使用的工具,尤其在企业级应用和互联网开发中占据着重要地位。本资源“Java入门到精通完整教程+源码.zip”提供了一个全面的学习路径,帮助初学者逐步掌握Java编程技能并进阶至精通。...

    web应用基础课后答案

    在“Web应用基础”这门课程中,我们探讨的是构建和理解互联网应用程序的基本概念和技术。这个压缩包文件可能包含了与15个不同章节相关的课后习题答案,旨在帮助学习者巩固所学知识并深入理解Web应用的工作原理。以下...

    java实现svn,svnkit框架的简单应用

    Java实现SVN,主要借助的是SVNKit框架,这是一款完全用Java编写的Subversion库,使得Java开发者能够轻松地在应用程序中集成版本控制系统Subversion的功能。本文将深入探讨如何使用SVNKit进行基础操作以及日志管理。 ...

    干货!资深java工程师面试要点大全+一年整理.pdf

    这是Java语言继承体系的基础,所有的类都继承自Object类,这意味着Object类中的方法在Java的任何对象中都可用,比如equals()、hashCode()、toString()、clone()等。clone()方法是一个特殊的对象复制方法,实现浅克隆...

    java设计模式pdf

    特别是,他提到了Java基础类库(Java Foundation Classes, JFC)的作用,这是一个包含大量标准组件的类库,为开发者提供了丰富的工具箱。 #### 四、创建型模式 接下来的部分重点介绍了一系列创建型模式,这些模式...

    Java开发详解.zip

    010301_【第3章:Java基础程序设计】_Java数据类型笔记.pdf 010302_【第3章:Java基础程序设计】_运算符、表达式与语句笔记.pdf 010303_【第3章:Java基础程序设计】_判断与循环语句笔记.pdf 010401_【第4章:数组与...

    Linux环境编译gdal java环境用到的文件

    Java环境的集成则可以让开发人员在Java应用程序中利用GDAL的功能。 首先,确保你的Linux系统上安装了必要的基础工具,如GCC编译器、make、cmake等。这些是构建C++项目的基本需求。你可能还需要安装一些开发库,例如...

    Java学习网站大全

    - **Oracle官方文档**:Java的官方教程,涵盖了从基础到高级的所有内容,是学习Java的首选之地。 - **Stack Overflow**:全球最大的开发者问答社区,解决Java编程中的疑难问题。 - **GitHub**:查找Java开源项目...

    Java基础面试题常见题目经典精选大全.docx

    Java基础面试题涵盖了许多核心概念,对于理解和掌握Java编程至关重要。以下是一些主要知识点的详细说明: 1. **面向对象编程(OOP)**:Java是一种面向对象的语言,其核心特性包括封装、继承、多态和抽象。封装是将...

    linux版gdal3.0.0版本编译文件Java用

    在Linux环境中,为了使用GDAL与Java应用程序交互,你需要编译GDAL的源代码,使其包含Java绑定。这里我们将详细探讨如何在Linux系统上编译GDAL 3.0.0版本,并使其适用于Java应用。 1. **环境准备**: 在开始编译...

Global site tag (gtag.js) - Google Analytics