?? date2.java
字號:
//【例3.3】 日期類的封裝。
public class Date2 //公有的類,與源程序文件同名
{
private int year,month,day; //私有的成員變量
public Date2(int y,int m,int d) //指定參數的構造方法
{
set(y, m, d); //可以調用定義在后面的成員方法
}
public Date2() //無參數的構造方法,重載
{
this(2006,1,1); //調用本類已定義的其他構造方法
}
public Date2(Date2 aday) //拷貝構造方法,由已存在對象創建新對象,重載
{
this(aday.year, aday.month, aday.day);
}
public void set(int y,int m,int d) //公有的成員方法,設置日期值,算法不全
{
this.year = y;
this.month = ((m>=1) & (m<=12)) ? m : 1;
this.day = ((d>=1) & (d<=31)) ? d : 1;
}
public void set(Date2 aday) //公有的成員方法,設置日期值,重載
{
set(aday.year, aday.month, aday.day); //調用同名成員方法,不能使用this()
}
public int getYear()
{
return year;
}
public int getMonth()
{
return month;
}
public int getDay()
{
return day;
}
public boolean equals(Date2 aday2) //比較當前對象與aday2對象是否相等
{
return this==aday2 ||
this.year==aday2.year && this.month==aday2.month && this.day==aday2.day;
}
public void tomorrow() //改變當前對象的日期值,算法不全
{
this.day++; //通過this改變當前對象的值,沒有返回值
}
public Date2 daysAfter(int n) //返回n天后的新日期對象,算法不全
{
return new Date2(this.year,this.month,this.day+n); //返回新創建的對象,沒有改變當前對象的值
}
public boolean isLeapYear()
{
return (year%400==0) || (year%100!=0) && (year%4==0);
}
public String toString()
{
return this.year+"-"+this.month+"-"+this.day;
}
public void print()
{
System.out.println("date is "+this.toString());
}
}
class Date2_ex //其他類,默認訪問權限
{
public static void main(String args[])
{
Date2 aday1 = new Date2(); //默認參數的構造方法
Date2 aday2 = new Date2(2006,2,28); //已知參數的構造方法
Date2 aday3 = new Date2(aday2); //由已知對象創建新對象
aday3.set(2007,12,31); //改變當前對象的值,不改變aday2的值
aday1.print();
aday2.print();
aday3.print();
Date2 aday4 = aday1.daysAfter(1); //返回新創建的對象
aday4.print();
aday1.tomorrow(); //改變當前對象的值
aday1.print();
System.out.println("aday4.equals(aday1) "+aday4.equals(aday1));
//比較兩個對象的值
}
}
/*
程序運行結果如下:
date is 2006-1-1
date is 2006-2-28
date is 2007-12-31
date is 2006-1-2
date is 2006-1-2
aday4.equals(aday1) true
*/
/*
程序正確:
程序錯誤:
1、聲明了有參數的構造方法后,沒有重載Date2()時,原先無參數的構造方法則無效了。
Date2 aday = new Date2(); //編譯錯,cannot find symbol symbol : constructor Date2()
public void setDate(Date2 aday) //公有的成員方法,設置日期值,重載
{
this(aday.year, aday.month, aday.day); //編譯錯,不能使用this(),call to this must be first statement in constructor
}
public String toString()
{
return this.year+'-'+this.month+'-'+this.day;//編譯錯,應該用"",incompatible types,found : int,required: java.lang.String
}
2、沒有覆蓋toString()時不行,輸出如下
date is Data2@757aef
date is Data2@d9f9c3等
3、沒有覆蓋equals()時不行,輸出如下
aday4.equals(aday1) false //結果錯,兩個對象的值相同
aday3.equals(aday2) false //結果錯,由拷貝構造方法創建的另一個對象
只有兩個對象引用同一個對象時,結果才對。例如,
aday3.equals(aday3) false //結果正確,同一個對象
或者
Date2 aday5 = aday2;
aday5.equals(aday2) false //結果正確,兩個對象引用同一個實例
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -