首先创建一个类:
/**
* 雇员类
* @author yifan
* @version 1.0 2014-05-12
*/
class Employ {
/**
* 构建一个新的职员类
* @param name 职员姓名
* @param salary 工资
* @param hireDate 入职时间
*/
public Employ (String name, double salary, Date hireDate) {
this.name = name;
this.salary = salary;
this.hireDate = hireDate;
}
/**
* 获取姓名
* @return 姓名
*/
public String getName() {
return this.name;
}
/**
* 获取当前工资
* @return 当前工资
*/
public double getSalary() {
return this.salary;
}
/**
* 安全的获取入职时间
* @return 入职时间
*/
public Date getHireDate() {
return (Date) this.hireDate.clone();
}
/**
* 非安全的获取入职时间
* @return
*/
public Date gethireDate() {
return this.hireDate;
}
/**
* 提高工资
* @param byPercent 提高的系数
*/
public void raiseSalary (double byPercent) {
this.salary += this.salary*byPercent/100;
}
private String name;
private double salary;
private Date hireDate;
}
在main方法中添加如下代码
// 下面试图修改员工的入职日期
// 不安全的获取信息方法使用
Date date= staff[0].gethireDate();
String name = staff[0].getName();
name = name.substring(2);
System.out.println(name);
double ten = 10 * 365.25 * 24 * 60 * 60 * 1000;
date.setTime(date.getTime() - (long)ten);
System.out.println("不安全的信息访问:" + staff[0].getName() + staff[0].getHireDate().toString());
// 安全的获取信息放法使用
Date date1= staff[1].getHireDate();
double ten1 = 10 * 365.25 * 24 * 60 * 60 * 1000;
date.setTime(date1.getTime() - (long)ten1);
System.out.println("安全的信息访问:" + staff[1].getName() + staff[1].getHireDate().toString());
上面的没有定义的对象自己去创建
运行程序后的结果是
张三123
不安全的获取信息方法调用张三Mon Dec 12 12:00:00 CST 1977
安全的获取信息方法调用李四Sat Jan 23 00:00:00 CST 1999
因为date是一个对象,Java中对于对象是引用传递, 所以实际上date就是指向员工入职时间的一个指针,所以对date对象进行了修改就相当与修改了员工的入职时间
那么问题2就来了
上面对name进行了修改位置为什么没有更改员工的姓名呢?
因为name对象的修改实际上就是将name指向了一个新的地方,而不是修改员工名字
说的不是很明白,希望大神无喷!!!