2 longer5153458 longer5153458 于 2013.08.18 18:30 提问

注意不要编写返回引用可变对象的访问器方法.--------要怎么证明呢
import java.util.Date;
import java.util.GregorianCalendar;

public class Employee {
    private String name;
    private double salary;
    private Date hireDay;
    public Employee(String n,double s,int year,int month,int day ){
        name = n;
        salary = s;
        GregorianCalendar calendar= new GregorianCalendar(year,month-1,day);
        hireDay=calendar.getTime();         
        }
    public void raiseSalary (double byPercent){
        double raise = salary*byPercent/100;
        salary += raise;
    }
    public Date getHireDay() {
        return (Date)hireDay.clone();
    }
    public String getName() {
        return name;
    }
    public double getSalary() {
        return salary;
    }

}



import java.util.Date;

public class EmployeeTest {
    public static void main(String[] args) {
        Employee [] staff =new Employee [3];
        staff [0]= new Employee("Carl Cracker", 75000, 1987, 12, 15);
        staff [1]= new Employee("Harry Hacker", 50000, 1989, 10, 1);
        staff [2]= new Employee("Tony Tester", 40000, 1990, 3, 15);

        for(Employee e:staff)
            e.raiseSalary(5);

        for(Employee e:staff)
            System.out.println("name="+e.getName()+",salary="+e.getSalary()
                                +",hireDay="+e.getHireDay());

        Employee harry=new Employee("harry",50000,1989,10,1);
        Date d=harry.getHireDay();
        double tenYearsInMilliSeconds=10*365.25*24*60*60*1000;
        d.setTime(d.getTime()-(long)tenYearsInMilliSeconds);

        System.out.println("name="+harry.getName()+",salary="+harry.getSalary()
                +",hireDay="+harry.getHireDay());

    }
}

为啥最后输出的hireDay跟构造器里的还是一样呢?不应该是改变了d的值也就改变了harry.gethireDay的值么?

1个回答

caikangying
caikangying   2017.08.28 16:37

public Date getHireDay() {
return (Date)hireDay.clone();
}
把它改一改就证明了

Csdn user default icon
上传中...
上传图片
插入图片