完善例3.2的日期类MyDate

实验要求:
1.完善set()方法,保证获得正确的日期值;
2.将tomorrow()和yestoday()方法合并为daysafter()方法,并增加一些方法:
public int getweek() //返回当前日期对应的是星期几,范围0-6
public String to WeekString() //返回当前日期对应星期几的中文字符串
public boolean before(MyDate d) //判断是否在规定日期之前
public int daysBetween(MyDate d) //返回当前日期与日期d之间相距的天数
易混淆的点:
1.类(引用数据类型)使用==、!=判断两个对象是否指向同一个实例,当两个对象引用同一个实例时,==结果为TURE,又因为引用数据类型无比较大小的概念,故不能使用<,<=,>,>=运算符;
2.equals()和==的区别:前者用于比较同一类的两个对象的值是否相等,不需要引用同一实例。假设已有一个Date类,若定义Date d2=d1则属于对象赋值,两个对象引用同一个实例,d1==d2且d1.equals(d2)==1;若为Date d2=new Date(d1)则为d2引用由d1拷贝构造的实例,此时d1!=d2,但d1.equals(d2)仍为1。
具体代码如下:
public class MyDate {
private int year,month,day;
private static int thisYear;
static {thisYear=2012;}
public MyDate(int year,int month,int day){this.set(year,month,day);}
public MyDate(){this(1970,1,1);}
public MyDate(MyDate d){this.set(d);}
public void set(int year,int month,int day){
this.year=year;
this.month=(month>=1&&month<=12)?month:1;
this.day=(day>=1&&day<=31)?day:1;}
public void set(MyDate d){
set(d.year,d.month,d.day);}
public int getYear(){
return this.year;}
public int getMonth(){
return this.month;}
public int getDay(){
return this.day;
}
public String toString(){
return year+"年"+String.format("%02d",month)+"月"+String.format("%02d",day)+"日";}
public static int getThisYear(){
return thisYear;}
public static boolean isLeapYear(int year)//判断是否为闰年{
return year%400==0||year%100!=0&&year%4==0;}
public boolean isLeapYear(){
return isLeapYear(this.year);}
public boolean equals(MyDate d){
return this==d||d!=null&&this.year==d.year&& this.month==d.month &&this.day==d.day;}
public static int daysOfMonth(int year,int month){
switch(month){
case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
case 4: case 6: case 9: case 11: return 30;
case 2: return MyDate.isLeapYear(year)?29:28;
default: return 0;}}
public int daysofMonth(){
return daysOfMonth(this.year,this.month);}
public void tomorrow(){
this.day++;
if(this.day>this.daysofMonth()){
this.day=1;
this.month++;
if(this.month>12){
this.month=1;
this.year++;}}}
public MyDate yestoday(){
MyDate date=new MyDate(this);
date.day--;
if(date.day==0){
date.month--;
if(date.month==0){
date.month=12;
date.year--;}
date.day=daysOfMonth(date.year,date.month);}
return date;}
public int getWeek(){
int i,j=0;
for(i=0;i<this.year;i++){
if(MyDate.isLeapYear(i))//静态访问
j++;
if(j>6)
j=0;}
for(i=0;i<this.month;i++){
i+=MyDate.daysOfMonth(this.year, this.month);}
j+=i%7;
if(j>6)
j-=7;
return j;}
public String toWeekString(){
int i;
i=getWeek(); //调用getweek函数判断当前为一周的第几天
switch(i){
case 0:return "星期一";
case 1:return "星期二";
case 2:return "星期三";
case 3:return "星期四";
case 4:return "星期五";
case 5:return "星期六";
case 6:return "星期天";}
return null;}
public boolean before(MyDate d){
return d.year<this.year||d.month<this.month||d.day<this.day;}
public int daysBetween(MyDate d)//先判断两个日期中间相差几年,再比较月份{
int i,t=0,sum=0;
if(this.before(d)){
for(i=d.year;i<this.year;i++){
if(isLeapYear(i))
sum+=366;
else
sum+=365;}
if(d.month<this.month)
for(i=d.month;i<this.month;i++)
sum+=daysOfMonth(this.year,i);
else{
for(i=this.month;i<d.month;i++)
t+=daysOfMonth(this.year,i);
sum-=t;}
return sum;}
for(i=this.year;i<d.year;i++){
if(isLeapYear(i))
sum+=366;
else
sum+=365;}
if(this.month<d.month)
for(i=this.month;i<d.month;i++)
sum+=daysOfMonth(d.year,i);
else{
for(i=d.month;i<this.month;i++)
t+=daysOfMonth(d.year,i);
sum-=t;}
return sum;}}
class MyDate_ex{
public static void main(String args[]){
System.out.println("今年是"+MyDate.getThisYear()+",闰年?"+MyDate.isLeapYear(MyDate.getThisYear()));
MyDate d1=new MyDate(2012,12,31);
MyDate d2=new MyDate(d1);//调用拷贝构造方法复制实例
MyDate d3=new MyDate(2013,12,31);
System.out.println("d1: "+d1+",d2: "+d2+",d1==d2? "+(d1==d2)+", d1.equals(d2)? "+d1.equals(d2));//当且仅当两个对象引用同一个实例时两个对象恒等,而equals()比较的是两个对象对应成员变量的值是否相等
System.out.print(d1+"的明天是 ");
d1.tomorrow();
System.out.println(d1+"\n"+d1+"的昨天是 "+(d2=d1.yestoday()));
System.out.println(d1+"是 "+d1.toWeekString());
if(d1.before(d3))
System.out.println(d3+" 在 "+d1+"之前");
else
System.out.println(d1+" 在 "+d3+"之前");
System.out.println(d1+"与"+d3+"相差"+d1.daysBetween(d3)+"天");}}

posted @ 2017-05-02 17:31  such  阅读(1879)  评论(0编辑  收藏  举报