java之标记型接口Cloneable
1、克隆用途。
Cloneable和Serializable一样都是标记型接口,它们内部都没有方法和属性,implements Cloneable表示该对象能被克隆,能使用Object.clone()方法。如果没有implements Cloneable的类调用Object.clone()方法就会抛出CloneNotSupportedException。
2、克隆分类。
(1)浅克隆(shallow clone),浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
(2)深克隆(deep clone),深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
举例区别一下:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2中包含对C2(C1的copy)的引用。
3、克隆举例。
要让一个对象进行克隆,其实就是两个步骤:
(1)让该类实现java.lang.Cloneable接口;
(2)重写(override)Object类的clone()方法。
4、浅克隆举例。
5、深克隆举例。
publicclass Wife implements Cloneable {privateint id; private String name; publicintgetId() { return id; } publicvoidsetId(int id) { this.id = id; } public String getName() { return name; } publicvoidsetName(String name) { this.name = name; } publicWife(int id,String name) { this.id = id; this.name = name; } @OverridepublicinthashCode() {//myeclipse自动生成的 finalint prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Overridepublicbooleanequals(Object obj) {//myeclipse自动生成的 if (this == obj) returntrue; if (obj == null) returnfalse; if (getClass() != obj.getClass()) returnfalse; Wife other = (Wife) obj; if (id != other.id) returnfalse; if (name == null) { if (other.name != null) returnfalse; } elseif (!name.equals(other.name)) returnfalse; returntrue; } @Overridepublic Object clone() throws CloneNotSupportedException { returnsuper.clone(); } /** * @param args * @throws CloneNotSupportedException */publicstaticvoidmain(String[] args) throws CloneNotSupportedException { Wife wife = new Wife(1,"wang"); Wife wife2 = null; wife2 = (Wife) wife.clone(); System.out.println("class same="+(wife.getClass()==wife2.getClass()));//true System.out.println("object same="+(wife==wife2));//false System.out.println("object equals="+(wife.equals(wife2)));//true } }
相关文章
- Java接口源码--System和应用程序进程间通信
- java面试题总结
- Java 接口和抽象类可以被new么?——顺便总结内部类
- 什么是Java Marker Interface(标记接口)
- 基于Java( GUI )实现多人在线聊天软件【100010209】
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
- Java集合框架中List接口的简单使用
- java自定义注解学习
- java面向对象基础(四):抽象类和接口
- java调用restful接口的方法
- 高阶函数与接口混入和java匿名类
- DevEco Studio 如何查看Java接口文档(HarmonyOS鸿蒙开发基础知识)
- jenkins ssh远程执行nohup Java 后无法断开
- Java学习-069-多线程02:实现 Runnable 接口
- Java Spring mvc 操作 Redis 及 Redis 集群
- 解决java.lang.NoClassDefFoundError错误
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- Java 系统学习梳理_【All】
- Java为什么使用抽象类和接口
- Java中接口的定义与实现
- java定义和实现接口
- Java小白入门200例109之Java Map集合详解
- Gson 转java对象,含有Date字段的问题(待解决)
- 排序-------简单选择实现(Java实现)