📄 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 + -