阅读代码从 main 开始

本文详细解读了一段关于Java日期操作的代码,通过逐步分析构造函数和关键方法,如tomorrow(),帮助读者理解如何实现日期的递增及边界判断。

前段时间有人拿出一段吕凤翥编著的《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/




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值