//《Java程序设计实用教程(第4版)》 作者:叶核亚,2014年11月20日
//《Java程序设计实用教程(第5版)》 作者:叶核亚,2016年7月25日
//§3.2 类的封装性
//【例3.2】 封装的日期类。
//虽然程序设计语言中没有使用3个整数作为日期的成员变量这样的声明,
//本例为样做的目的是,一,为了演示日期计算的算法,
//二,每种程序设计语言中日期功能总是不够,转换成年月日整数虽然麻烦,却是共同可用的。
//【思考题3-3】 MyDate类增加功能。
//java.util.Date和Calendar功能不够,所需的很多方法仍然需要通过年月日进行比较,所以写在MyDate类中
//为第6章制作多种日期 组件做准备
//【例5.3】 日期类的异常处理。
import java.util.*;
import java.text.SimpleDateFormat;
//日期类,公有,与源程序文件同名//序列化,例8.3
public class MyDate implements Comparable<MyDate>, java.io.Serializable
{
private int year,month,day; //年月日,私有成员变量
private static int thisYear=2018; //当前年份,私有静态成员变量
static //静态成员变量初始化
{
thisYear=2018;
// thisYear = java.util.Calendar.getInstance().get(Calendar.YEAR); //获得当前日期对象中的年份值,4.3.2节
// thisYear = new java.util.GregorianCalendar().get(Calendar.YEAR); //获得当前日期对象中的年份值,4.3.2节
}
public MyDate() //无参数构造方法,指定缺省日期,重载
{
this(1970,1,1); //调用本类已声明的其他构造方法
}
//构造方法,指定日期。//第3章例3.2,没有抛出异常
//构造方法,若参数不能构造日期,本方法无法处理异常,则抛出日期格式异常。//第5章例5.2,抛出异常
public MyDate(int year, int month, int day) throws DateFormatException
{
// super(); //默认调用Object()
this.set(year, month, day); //例3.2,调用本类的成员方法。//例5.2,该方法声明抛出日期格式异常
}
//拷贝构造方法,日期同参数,重载。
public MyDate(MyDate date) throws DateFormatException
{
this.set(date);
}
/* public void set(int year, int month, int day) //设置日期值,算法不全,改进见5.2.3节
{
this.year = year; //this.year指当前对象的成员变量,year指参数
this.month = (month>=1 && month<=12) ? month : 1; //this引用不能省略
this.day = (day>=1 && day<=31) ? day : 1;
} */
public void set(MyDate date) //设置日期值,重载
{
this.set(date.year, date.month, date.day); //调用同名成员方法,不能使用this()
}
//5.2.3节,例5.2 此方法不需要抛出日期格式异常//throws DateFormatException
//因为,date参数是日期,没有错误。
public int getYear() //获得年份
{
return this.year;
}
public int getMonth() //获得月份
{
return this.month;
}
public int getDay() //获得当月日期
{
return this.day;
}
public String toString() //中文日期格式字符串,2位月日
{
return this.year+"年"+String.format("%02d", this.month)+"月"+
String.format("%02d", this.day)+"日";//+this.toWeekString();
}
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); //调用静态方法
}
//比较由this和date参数引用的实例值是否相等。
//若this与date引用同一个实例,则相等;若它们分别引用两个
//实例,则分别比较它们的各成员变量值是否对应相等
public boolean equals(MyDate date)
{
// System.out.println(b+",执行equals(MyDate date)方法");
//this指代调用当前方法的对象,this.year等访问当前对象的成员变量(此3处this可省略)
return this==date || //若this与date引用同一个实例,则相等
date!=null && this.year==date.year && this.month==date.month && this.day==date.day;
//若this与date分别引用两个实例,则分别比较它们的各成员变量值是否对应相等
}
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);
}
//第4版
public void tomorrow4() //将this引用实例的日期改为之后一天日期,没有返回值
{
this.day++;
if(this.day>this.daysOfMonth())
{
this.day=1;
this.month++;
if(this.month>12)
{
this.month=1;
this.year++;
}
}
}
//第5版,采用%
public void tomorrow() //将this引用实例的日期改为之后一天日期,没有返回值
{
this.day = this.day%this.daysOfMonth()+1;
if(this.day==1)
{
this.month = this.month%12+1; //下月
if(this.month==1) //12月的下月是明年1月
this.year++;
}
}
//第4版
public MyDate yestoday4() //返回当前日期的前一天日期
{
MyDate date = new MyDate(this); //执行拷贝构造方法,创建实例,没有改变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; //返回对象date引用的实例
}
//第5版,采用%
public MyDate yestoday() //返回当前日期的前一天日期
{
MyDate date = new MyDate(this); //执行拷贝构造方法,创建实例,没有改变this
date.day--;
if(date.day==0)
{
date.month = (date.month-2+12)%12+1; //上月
if(date.month==12) //1月的上月是去年12月
date.year--;
date.day = daysOfMonth(date.year, date.month);
}
return date; //返回对象date引用的实例
}
//例3.2 main()
//3.4.4 多态的方法实现
//【思考题3-5】【试3.17】
public boolean equals(Object obj) //覆盖Object类的equals()方法
{
if(this==obj) //this指代调用当前方法的对象
return true;
if(obj instanceof MyDate) //判断当前对象是否属于MyDate类
{
MyDate date = (MyDate)obj; //类型强制转换
return this.year==date.year && this.month==date.month && this.day==date.day;
}
return false;
}
//《Java程序设计实用教程(第5版)习题解答与实验指导》
//【习3.3】MyDate类增加daysAfter(int n)方法。//第5版改进,使用%??
public MyDate daysAfter(int n) //返回当前日期之后n天的日期
{
if(n<0)
return daysBefore(-n); //算法类似,方法声明省略
MyDate date = new MyDate(this); //执行拷贝构造方法,复制当前对象
评论0