package corejava;
import static java.lang.Math.*;
import java.io.IOException;
import java.math.*;
import java.nio.file.Paths;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class CoreJava {
public static void main(String[] args) throws IOException {
// Scanner in=new Scanner(Paths.get("in.txt"),"utf-8");
Emplee harry = new Emplee(2020, 8, 26);
Date d = harry.gethireday();
double ten = 10 * 365 * 24 * 60 * 60 * 1000;
d.setTime(d.getTime() - (long) ten);
System.out.println(d);
System.out.println(harry.gethireday());
}
}
class Emplee {
public Emplee(int year, int month, int day) {
// TODO Auto-generated constructor stub
GregorianCalendar c = new GregorianCalendar(year, month, day);
hireday = c.getTime();
}
private Date hireday;
//
// public Date gethireday() {
// return (Date) hireday.clone();
// }
public Date gethireday()
{
return hireday;
}
}
如果Emplee类的gethireday方法如下:
public Date gethireday()
{
return hireday;
}
则会改变Emplee的变量hireday。
这是不对的,date对象是可变的,这破坏了封装性!
应该是:需要返回可变对象的引用时,先进行克隆,克隆的对象放在另一个位置上,改变的时候不会影响本来的值。d和harry.hireday引用同一个对象,所以对d改变是影响了hireday私有变量。
public Date gethireday() {
return (Date) hireday.clone();//需要返回可变对象的引用时,先进行克隆,克隆的对象放在另一个位置上,改变的时候不会影响本来的值。d和harry.hireday引用同一个对象,所以对d改变是影响了hireday私有变量。
}
结果: