實驗要求:
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)+"天");}}