3.第6章——增添字符串、对象数组
改动的一些点:本章实例中增加了Date类,对照前两章做出java的一些基本类格式的改动即可。此外的改动有:
(1)java中字符串类型不需要像C++那样还要调用std::string,而直接使用默认包lang中String类。
(2)在使用Date对象引用作参数时,由于java没有引用类型的符号&,所以在作函数形参时直接使用Date对象。
(3)在创建Date对象时,java不能直接使用类名创建类的对象,而需要用Date date=new Date(int,int,int)才能声明并初始化一个Date对象,同样当需要创建一个Date对象作参数时也需要new一个Date对象。
(4)java里面对象数组有多种写法,其中的每一个对象也都需要和上面说的方法一样一个一个new。最简单的写法就是:SavingsAccount[]accounts={new SavingsAccount(date,String,double),new ......}
(5)C++中的sizeof()函数用来计算对象所占内存空间大小,在java里没有。所以将n=sizeof(accounts)/sizeof(SavingsAccount)改成了accounts.length()。其中length()方法返回数组长度,实现的功能相同。
源代码:
Data类:public class Date {
private int year,month,day,totalDays;//该日期是从公元元年1月1日开始的第几天
private final int[] DAYS_BEFORE_MONTH={0,31,59,90,120,151,181,212,243,273,304,334,365};
public Date(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
if(day<=0||day>getMaxDay()){
System.out.print("Invalid date");
show();
System.out.println("");
System.exit(1);
}
int years=year-1;
totalDays=years*365+years/4-years/100+years/400+DAYS_BEFORE_MONTH[month-1]+day;
if(isLeapYear()&&month>2) totalDays++;
}
public final int getMaxDay() {
if(isLeapYear() && month==2) return 29;
else return DAYS_BEFORE_MONTH[month]-DAYS_BEFORE_MONTH[month-1];
}
public final void show() {
System.out.print(getYear()+"-"+getMonth()+"-"+getDay());
}
public final int getYear() {return year;}
public final int getMonth() {return month;}
public final int getDay() {return day;}
public final boolean isLeapYear() {
return year%4==0&&year%100!=0||year%400==0;
}
public final int distance(final Date date) {
return totalDays-date.totalDays;
}
}
SavingAccount6类:
public class SavingsAccount6 {
private static double total=0;private String id;
private Date lastDate;//账号,上一次余额变动日期
private double balance,rate,accumulation;//余额,年利率,余额按日累加值
public static double getTotal(){return total;}
public SavingsAccount6(final Date date,final String id,double rate){
lastDate=date;
this.id=id;