前段时间有人拿出一段吕凤翥编著的《Java 语言程序设计》中的程序,说看不懂,很乱,于是我写了一些注释,里面包含了阅读的思路以及顺序,在这里贴一下。我觉得无论是什么语言,都应该从 main 开始,模仿执行代码的顺序阅读,这样才比较好。
public class Exam3_6{
//看程序一般从main方法开始看起。所以,跳到第68行。
private int year,month,day;
Exam3_6(){
year=2000;
month=1;
day=1;
//书里面这个方法错误,并没有括号,并不能形成构造函数。
//对象 d1 就是用这个构造函数构造的,所以 year、month
//和 day 被附了值。
//方法看完了,回到主函数,也就是第 72 行。
}
Exam3_6(int a, int b, int c){
year = a;
month = b;
day = c;
//也就是说,通过这个构造方法构造出来的对象是可以根据喜好设定变量的值的。
//好,返回第 80 行。
}
Exam3_6(Exam3_6 d){
year = d.year;
month = d.month;
day = d.day;
//并没有什么新东西,都是将目前用的 Exam3_6 类型对象的几个变量给新创建的对象。
//跳回第 39 行继续查看 tomorrow() 方法吧。
}
public void outDate(){
//此方法是打印year、month和day三个变量,这三个变量在一开始就定义好了的,
//为int形,由于对象 d1 是直接生成,所以跳到第 6 行查看。
System.out.print(year+"/"+month+"/"+day);
}
public Exam3_6 tomorrow(){
Exam3_6 d = new Exam3_6(this);
//这个方法创建了一个新的对象,是用第 23 行的构造函数构造的,跳到第 23 行
//看看用这种构造方式会生成什么样的对象吧。
d.day++;//啊,新对象的变量 day 加 1 了呢!
if (d.day>d.daysInMonth()) {
//看来day 的数值是不能随便加的,有个约束,调用了 daysInMonthe() 方法,
//那么跳到第 52 行看看这个方法是干什么的吧。
d.day = 1;
d.month ++;
if (d.month>12) {
d.month = 1;
d.year ++;
}
}
return d;//把新生成的对象发布了出去!方法看完了,跳回第 75 行吧!
}
public int daysInMonth(){
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;
default:
if (year%4==0&&year%100!=0||year%400==0) {
return 29;
}else {
return 28;
}
}
//简而言之,这个方法就是确定日期是正常的,不会出现类似 2 月 30 日 这样的情况。
//那好,跳回 43 行吧。
}
public static void main(String[] args) {
Exam3_6 d1 = new Exam3_6();//新生成了一个对象。
System.out.print("The current date is (year/month/day)");
d1.outDate();//调用outDate()方法,跳到第30行查看。
System.out.println();
System.out.print("Its tomorrow is (year/month/day)");
d1.tomorrow().outDate();//这时候对象 d1 调用了 tomorrow() 方法,这个方法干什么用的呢?跳到第 35 行查看。
//没玩呢,d1 调用了 tomorrow() 方法之后返回的是一个新对象 d ,那么这时候是 d 调用 onDate() 方法。
//至于 onDate() 方法是干什么的,刚才已经读过了,要是忘记了可以回头看看。
System.out.println();
Exam3_6 dd = new Exam3_6(2004,2,8);//啊哈!有新创建了一个对象,这个对象是用第三种构造函数创建的,跳到第
//16 行看看如此构造会有怎样的的性质。
System.out.print("The current date is (year/month/day)");
dd.outDate();
System.out.println();
System.out.print("Its tomorrow is (year/month/day)");
dd.tomorrow().outDate();
System.out.println();
//对象 dd 调用的几个方法和 d1 么有什么区别,这里就不赘述了。书上调用 tomorrow() 方法的时候少了括号。
//Done!
}
}
另外我觉得《Head First Java》这本书比较好。http://book.douban.com/subject/2000732/
本文详细解读了一段关于Java日期操作的代码,通过逐步分析构造函数和关键方法,如tomorrow(),帮助读者理解如何实现日期的递增及边界判断。

被折叠的 条评论
为什么被折叠?



