//《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); //执行拷贝构造方法,复制当前对象
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
《Java程序设计实用教程(第5版)》 作者:叶核亚 示例代码 (842个子文件)
jdk8.bat 115B
2010.bmp 2.16MB
2010 2.bmp 1.89MB
2010 20.bmp 926KB
D.bmp 0B
FileStream_byte1.byte 2B
EditorJFrame.class 11KB
PersonJFrame.class 10KB
CityTreePersonJFrame.class 9KB
InputMatchJInFrame.class 9KB
MutableJTree.class 9KB
InputTeamJInFrame.class 8KB
FileManagerJFrame.class 7KB
MyDate.class 7KB
LoanJFrame.class 6KB
FileRandomJFrame.class 6KB
PersonJPanel.class 5KB
MyInteger.class 5KB
BrowseJInFrame.class 5KB
MDIWorldcupJFrame.class 5KB
CompareArray.class 5KB
ChatMultiTCPSocketJFrame.class 5KB
DrawTCPSocketJFrame.class 4KB
WelcomeJFrame$RollbyJPanel.class 4KB
QueryJFrame.class 4KB
ChatUDPJFrame.class 4KB
RoseJFrame.class 4KB
Person.class 4KB
ListMultiSelectJFrame.class 4KB
ChatMultiTCPSocketJFrame$TabPageJPanel.class 4KB
CrosstabQueryJFrame.class 4KB
ListJFrame.class 4KB
TextEditorJFrame.class 4KB
ListModelObjectFile.class 4KB
MoneyJFrame.class 4KB
ListModelDataFile.class 4KB
QueryFrame.class 4KB
MDITextEditorJFrame.class 4KB
MDITextEditorJFrame$TextJIFrame.class 4KB
Reflection.class 4KB
CollectionFile.class 4KB
IntArray5.class 4KB
ArithmeticOperationJFrame.class 4KB
ListModelText.class 4KB
ReceiverJFrame.class 3KB
ChatMulticastJFrame.class 3KB
PersonSort_ex.class 3KB
ArithOperJFrame.class 3KB
FileListJFrame.class 3KB
TableModelDataFile.class 3KB
Student.class 3KB
TableModelText.class 3KB
TableModelObjectFile.class 3KB
BinaryOperation.class 3KB
ListModelOper.class 3KB
Polygon.class 3KB
Line.class 3KB
FilePersonJFrame.class 3KB
DealTCPServerJFrame.class 3KB
TimeBroadcastJFrame.class 3KB
JTextAreaText.class 3KB
CollectionText.class 3KB
Rectangle.class 3KB
String_equals.class 3KB
CardReceiveSocketJFrame.class 3KB
Person.class 2KB
Arrays_sort.class 2KB
CardReceiveFromStreamJFrame.class 2KB
RoseJFrame$RoseCanvas.class 2KB
Globe.class 2KB
GetDBAbout.class 2KB
MonthlyCalendar.class 2KB
ObjectArray.class 2KB
Triangle.class 2KB
StudentSort.class 2KB
DrawLineJFrame.class 2KB
FileStream.class 2KB
Cylinder.class 2KB
FontsListJFrame.class 2KB
DrawJFrame.class 2KB
FileStream_byte4.class 2KB
IntArray1.class 2KB
AreaVolumn_ex.class 2KB
ButtonAddFrame.class 2KB
PersonArray_例3_6.class 2KB
RandomCardSendThread.class 2KB
DrawLineJFrame1.class 2KB
NumberThread.class 2KB
CardReceiveJFrame.class 2KB
ReceiveThread1.class 2KB
Ellipse.class 2KB
MyDate例3_2.class 2KB
PersonArray_oldest.class 2KB
LockedFetchThread.class 2KB
ColorReflection.class 2KB
Point.class 2KB
Person例3_3.class 2KB
ClosedFigure.class 2KB
ClosedFigure_ex.class 2KB
ChineseWeek.class 2KB
共 842 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9
叫我豆豆哥哥
- 粉丝: 14
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0