博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的克隆
阅读量:7052 次
发布时间:2019-06-28

本文共 2171 字,大约阅读时间需要 7 分钟。

  根据一个现有对象克隆出多个对象,这叫做原型模式。Java中的Cloneable接口定义了对象的克隆,它是一个声明式接口,没有定义任何抽象方法。Cloneable接口存在的唯一意义是:告知Java虚拟机,可以在该对象上调用Clone()方法。实际上,Clone()方法定义在Object类中,并且它是一个protected方法,如下所示:

protected native Object clone() throws CloneNotSupportedException;复制代码

  当对一个没有实现Cloneable接口的类的实例上调用clone()方法时,将会抛出CloneNotSupportedException。也是说是,如果希望调用对象的clone()方法,我们需要:

  • 实现Cloneable()接口
  • 重写clone()方法,并修改方法的访问修饰符为public

如下所示:

class Student {	private String name;	private int age;	@Override	public Student clone() throws CloneNotSupportedException {		// TODO Auto-generated method stub		return (Student) super.clone();	}	Student(String name, int age) {		this.name = name;		this.age = age;	}	public String getName() {		return name;	}	public int getAge() {		return age;	}}复制代码

  类Student实现了Cloneable接口并重写了clone()方法,同时修改访问修饰符为public。在重写后的方法体中,调用Object类的clone()方法。Object类的clone()方法,实现的是浅度克隆,所谓的浅度克隆是指,只克隆值类型属性,不可隆引用类型属性,而是将克隆对象的引用属性指向原对象的对应属性。如下所示:

public static void main(String[] args) throws CloneNotSupportedException {		Student1 student = new Student1("hhx", 12);		Student1 student2 = student.clone();		System.out.println(student.getAge() == student2.getAge()); // true		System.out.println(student.getName() == student2.getName()); // true	}复制代码

  如果希望实现深度克隆,也就是既克隆值类型属性,也克隆引用类型属性,则必须重写clone()方法的内容,如下所示:

class Student2 {	private String name;	private int age;	@Override	public Student2 clone() throws CloneNotSupportedException {		Student2 student = new Student2(name, age);		student.name = new String(name);		return student;	}	Student2(String name, int age) {		this.name = name;		this.age = age;	}	public String getName() {		return name;	}	public int getAge() {		return age;	}}复制代码

  此时,有:

public static void main(String[] args) throws CloneNotSupportedException {		Student2 student = new Student2("hhx", 12);		Student2 student2 = student.clone();		System.out.println(student.getAge() == student2.getAge()); // true		System.out.println(student.getName() == student2.getName()); // false	}复制代码

  以上就是Java中的克隆机制,最后再总结一下Java中方法重载与重写的区别:方法重载作用于同一个类中的不同方法之间,要求方法的名称相同,方法的参数不完全相同;而方法重写用于父类和子类之间,要求名称和参数完全相同,而方法的返回类型和抛出的异常类型必须和原方法相同或是子类,而方法的访问修饰符只能增加不能减小。

转载于:https://juejin.im/post/5c25983ce51d4535c9267779

你可能感兴趣的文章
EXCEL 2010学习笔记 —— VLOOKUP函数 嵌套 MATCH 函数
查看>>
android graphics: 2D animation
查看>>
升级 python 2.6.6 系统到 2.7.10 版本
查看>>
start with connect by prior 递归查询用法
查看>>
OS X 10.11 安装Cocoapods
查看>>
基于 HTML5 的工业互联网 3D 可视化应用
查看>>
洛谷——P1160 队列安排(链表的基础操作)
查看>>
MATLAB测试机器零阈值的大小
查看>>
单元格内文本显示超过单元格宽度的解决办法
查看>>
List遍历以及剔除指定数据
查看>>
[UIKit学习]06.懒加载,模型,自定义代码段,重写构造方法
查看>>
mv 批量
查看>>
require.js的AMD规范详解
查看>>
再转一篇gtest1.6安装
查看>>
sql Truncate 与 delete的区别
查看>>
linux case ${variable} in
查看>>
洛谷3801:红色的幻想乡——题解
查看>>
Hosts文件
查看>>
算法之旅
查看>>
wget的使用方法及一些举例
查看>>