黑马程序员--对象的克隆
2014-02-08 13:10
387 查看
---------- android培训、java培训、期待与您交流! ----------
对象的克隆
对象的克隆又称对象的复制,它与对象的赋值不是一个含义,他们的区别可以根据下面的例子看出。
假设Student是一个类,并且该类有一个正确的clone()方法,下面的代码:
例一
Student s1 = new Student();
Student s2 = s1;
例二
Student s1 = new Student();
Student s2 = (Student)s1.clone();
例一实际上是完成了对象引用的复制,也就是s1和s2指向是同一个对象。内存模型如下图
而例二则完成了s1对象的复制,把复制的的新对象用s2引用,s1和s2是两个对象,因为clone()方法返回的是Object类的对象,所以要对其返回值进行强制类型转换,以得到真确的对象。内存模型如下图:
对象的克隆通过clone()方法来实现,clone()方法将返回一个新对象,且新对象的初始状态与调用clone()方法的对象完全相同,对新克隆对象的的修改不会影响原对象的状态。在Object
类中定义了clone()方法,并且该方法被声明为protected类型,这就是决定了该方法只有在父类的包中和她的后代中才是可见的,尽管克隆方法是在所有类的父类Object中定义的,但克隆不会再每个类里自动进行,这意味着如果希望一个类能够克隆,必须要完成以下操作:
第一, 实现Cloneable接口第二,覆盖clone()方法,并且把覆盖访问权限设为public。第三:在自己的clone()方法中调用super.clone()。第四自己的clone()中捕获CloneNotSupertedException异常。
克隆对象实例:
package com.itheima;
class Student implements Cloneable {
char sex;
int age;
Student(char sex, int age) {
this.sex = sex;
this.age = age;
}
public Object clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException e) {
System.out.println("对象无法克隆");
}
return object;
}
}
public class StudentClone {
public static void main(String[] args) {
Student s1 = new Student('男', 12);
Student s2= (Student) s1.clone();
System.out.println("对象一" + s1);
System.out.println("s1.sex" + "=" + s1.sex + "s1.age" + "=" + s1.age);
System.out.println("对象二" + s2);
System.out.println("s2.sex" + "=" + s2.sex + "s2.age" + "=" + s2.age);
}
}
对象的克隆
对象的克隆又称对象的复制,它与对象的赋值不是一个含义,他们的区别可以根据下面的例子看出。
假设Student是一个类,并且该类有一个正确的clone()方法,下面的代码:
例一
Student s1 = new Student();
Student s2 = s1;
例二
Student s1 = new Student();
Student s2 = (Student)s1.clone();
例一实际上是完成了对象引用的复制,也就是s1和s2指向是同一个对象。内存模型如下图
而例二则完成了s1对象的复制,把复制的的新对象用s2引用,s1和s2是两个对象,因为clone()方法返回的是Object类的对象,所以要对其返回值进行强制类型转换,以得到真确的对象。内存模型如下图:
对象的克隆通过clone()方法来实现,clone()方法将返回一个新对象,且新对象的初始状态与调用clone()方法的对象完全相同,对新克隆对象的的修改不会影响原对象的状态。在Object
类中定义了clone()方法,并且该方法被声明为protected类型,这就是决定了该方法只有在父类的包中和她的后代中才是可见的,尽管克隆方法是在所有类的父类Object中定义的,但克隆不会再每个类里自动进行,这意味着如果希望一个类能够克隆,必须要完成以下操作:
第一, 实现Cloneable接口第二,覆盖clone()方法,并且把覆盖访问权限设为public。第三:在自己的clone()方法中调用super.clone()。第四自己的clone()中捕获CloneNotSupertedException异常。
克隆对象实例:
package com.itheima;
class Student implements Cloneable {
char sex;
int age;
Student(char sex, int age) {
this.sex = sex;
this.age = age;
}
public Object clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException e) {
System.out.println("对象无法克隆");
}
return object;
}
}
public class StudentClone {
public static void main(String[] args) {
Student s1 = new Student('男', 12);
Student s2= (Student) s1.clone();
System.out.println("对象一" + s1);
System.out.println("s1.sex" + "=" + s1.sex + "s1.age" + "=" + s1.age);
System.out.println("对象二" + s2);
System.out.println("s2.sex" + "=" + s2.sex + "s2.age" + "=" + s2.age);
}
}
相关文章推荐
- Python动态类型的学习---引用的理解
- 土人系列AS入门教程 -- 对象篇
- javascript asp教程第十一课--Application 对象
- VBS教程:对象-正则表达式(RegExp)对象
- sql2008启动代理未将对象应用到实例解决方案
- asp提示Server 对象 错误 ASP 0178 : 80070005
- Javascript 对象的解释
- JavaScript对象、属性、事件手册集合方便查询
- JavaScript对象学习经验整理
- Javascript继承(上)――对象构建介绍
- asp页面提示Response 对象 错误 ASP 0156 : 80004005 HTTP 头错误
- JavaScript面象对象设计
- 通过event对象的fromElement属性解决热区设置主实体的一个bug
- JavaScript 对象、函数和继承
- JavaScript的面向对象(二)
- 判断JavaScript对象是否可用的最正确方法分析
- Javascript的数组与字典用法与遍历对象的属性技巧
- js window.event对象详尽解析
- js 对象外部访问或者调用问题
- php中显示数组与对象的实现代码