class Employee { public Employee(String n, double s, int year, int month, int day) { name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); // GregorianCalendar uses 0 for January hireDay = calendar.getTime(); } public String getName() { return name; } public double getSalary() { return salary; } public Date getHireDay() { return hireDay; } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } private String name; private double salary; private Date hireDay; }
假如创建一个对象
Employee ben=new Employee("ben",10000,2014,4,1); Date d=ben.getHireDay(); MyLog.a(d.toString()); double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000; d.setTime(d.getTime() - (long) tenYearsInMilliSeconds); MyLog.a(ben.getHireDay().toString());
显示结果如下:
Tue Apr 01 00:00:00 CST 2014 Wed Mar 31 12:00:00 CST 2004
这里就出现问题了,再次调用 ben.getHireDay()查看时发现已经改变了,原因就是返回值实际上是一个指针,当对d做操作时,实际上是改hireDay的内存,那么原有的对象就改变了,这样编程语法上不会有什么问题,但实际上谬以千里,还需注意。
正确写法如下:
public Date getHireDay() { return (Date) hireDay.clone(); }
再次运行,没有问题:
Tue Apr 01 00:00:00 CST 2014 Tue Apr 01 00:00:00 CST 2014
同时对String和Double做了测试:
没有这个问题。