我的java学习笔记(16)关于对象克隆与调回
2015-04-02 19:51
597 查看
1.当拷贝一个变量时,原始变量与拷贝变量引用同一个对象,改变一个变量所引用的对象将会对另一个变量产生影响。
2.如果创建一个对象的新的copy,它的状态与原来的对象一样,但以后可以各自改变各自的状态,那就需要使用clone方法。
3.如果对象中的所有数据域都属于数值或基本类型,这样的拷贝域没有任何问题,但是如果在对象中包含了子对象的引用,拷贝的结果会使得两个域引用同一个子对象,因此原始对象与克隆对象共享这部分信息。
4.默认的克隆操作是浅拷贝,它并没有克隆包含在对象中的内部对象。
5.如果一个对象需要克隆,而没有实现Cloneable接口,就会产生一个以检验异常。
6.即便clone的默认实现即浅拷贝能够满足需求,也应该实现Cloneable接口,将clone重定义为public,并调用super.clone()。
7.只要在clone中没有实现Cloneable接口的对象,Object类的clone方法就会抛出一个CloneNotSupportException异常。
实例代码
测试类
雇员类
8.调回是一种常见的程序设计模式,在这种模式中,可以指出某个特点事件发生时应采取的动作。
实例代码
测试类
功能类
结果
a a1 = new a(); a a2 = a1; a2.up(10);//a1也会改变
2.如果创建一个对象的新的copy,它的状态与原来的对象一样,但以后可以各自改变各自的状态,那就需要使用clone方法。
a a1 = new a(); a a2 = a1.clone(); a2.up(10);//a1不会改变了
3.如果对象中的所有数据域都属于数值或基本类型,这样的拷贝域没有任何问题,但是如果在对象中包含了子对象的引用,拷贝的结果会使得两个域引用同一个子对象,因此原始对象与克隆对象共享这部分信息。
4.默认的克隆操作是浅拷贝,它并没有克隆包含在对象中的内部对象。
5.如果一个对象需要克隆,而没有实现Cloneable接口,就会产生一个以检验异常。
6.即便clone的默认实现即浅拷贝能够满足需求,也应该实现Cloneable接口,将clone重定义为public,并调用super.clone()。
7.只要在clone中没有实现Cloneable接口的对象,Object类的clone方法就会抛出一个CloneNotSupportException异常。
实例代码
测试类
public class test { public static void main(String[] args) { try { Employee exp = new Employee("w1",1000); exp.setHireDay(2014, 4, 2); Employee copy = exp.clone(); copy.raiseSalary(50); copy.setHireDay(2014, 3, 2); System.out.println("exp =" + exp); System.out.println("copy =" + copy); } catch(CloneNotSupportedException e) { e.printStackTrace(); } } }
雇员类
import java.util.*; public class Employee implements Cloneable { private String name; private double salary; private Date hireDay; public Employee(String n,double s) { name = n; salary = s; hireDay = new Date(); } public Employee clone() throws CloneNotSupportedException { Employee cloned = (Employee) super.clone(); cloned.hireDay = (Date)hireDay.clone(); return cloned; } public void setHireDay(int year,int month,int day) { Date newHireDay = new GregorianCalendar(year,month - 1,day).getTime(); hireDay.setTime(newHireDay.getTime()); } public void raiseSalary(double p) { double raise = salary * p / 100; salary += raise; } public String toString() { return "Employee[name =" + name + ",salary =" + salary + ",hireDay =" + hireDay +"]"; } }
8.调回是一种常见的程序设计模式,在这种模式中,可以指出某个特点事件发生时应采取的动作。
实例代码
测试类
import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.Timer; public class test { public static void main(String[] args) { ActionListener li = new TimePrinter(); Timer t = new Timer(10000,li); t.start(); JOptionPane.showMessageDialog(null, "退出?"); System.exit(0); } }
功能类
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.*; public class TimePrinter implements ActionListener{ public void actionPerformed(ActionEvent event) { Date now = new Date(); System.out.println("现在时间是:" + now); Toolkit.getDefaultToolkit().beep(); } }
结果
相关文章推荐
- 我的java学习笔记(16)关于内部类(part 1)
- Java 对象的 toString() 方法 -Java 学习笔记 (16)
- 传智博客学习笔记16--JAVA SCRIPT HTML语言基础
- Java 学习笔记23:关于Java Session使用
- java学习笔记16--异常
- 关于高效能java(practical java学习笔记)
- Java学习笔记16
- java学习笔记:关于IO转换流InputStreamReader和OutputStreamWriter
- 【Java学习笔记】Java中关于tostring方法的误操作
- Java与Flex学习笔记(16)---Red5流媒体服务器的安装与测试
- java学习笔记16--异常
- JAVA学习笔记--关于System.out.println()
- Java学习笔记-关于默认类型或访问权限的总结
- 【Java学习笔记】关于默认值
- java学习笔记,关于java的一些基础知识,适用于初学者,第一节
- Java学习笔记18天---(16)
- Java学习笔记---16.面向对象编程11-Java多态性,instanceof及Object类
- 关于JAVA中 内部类的几点学习笔记
- java学习笔记16--异常
- Java学习笔记之五——关于"equals"和“==”的区别