⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 date2.java

📁 《Java2程序设计实用教程(第2版)》课件
💻 JAVA
字号:
//【例3.3】  日期类的封装。

public class Date2                               //公有的类,与源程序文件同名
{ 
    private int year,month,day;                  //私有的成员变量
    
    public Date2(int y,int m,int d)              //指定参数的构造方法
    {
        set(y, m, d);                            //可以调用定义在后面的成员方法
    } 
    
    public Date2()                               //无参数的构造方法,重载
    {
        this(2006,1,1);                          //调用本类已定义的其他构造方法
    } 
    
    public Date2(Date2 aday)                     //拷贝构造方法,由已存在对象创建新对象,重载
    {
        this(aday.year, aday.month, aday.day);
    } 

    public void set(int y,int m,int d)           //公有的成员方法,设置日期值,算法不全
    {
        this.year = y;
        this.month = ((m>=1) & (m<=12)) ? m : 1;
        this.day = ((d>=1) & (d<=31)) ? d : 1;
    } 
    
    public void set(Date2 aday)                  //公有的成员方法,设置日期值,重载
    {
        set(aday.year, aday.month, aday.day);    //调用同名成员方法,不能使用this()
    } 

    public int getYear()
    {
        return year;
    }
    
    public int getMonth()
    {
        return month;
    }
    
    public int getDay()
    {
        return day;
    }
    
    public boolean equals(Date2 aday2)           //比较当前对象与aday2对象是否相等
    {
        return this==aday2 || 
               this.year==aday2.year && this.month==aday2.month && this.day==aday2.day;
    } 

    public void tomorrow()                       //改变当前对象的日期值,算法不全
    {
        this.day++;                   //通过this改变当前对象的值,没有返回值
    }

    public Date2 daysAfter(int n)                //返回n天后的新日期对象,算法不全
    {
        return new Date2(this.year,this.month,this.day+n);   //返回新创建的对象,没有改变当前对象的值
    }
    
    public boolean isLeapYear()
    {
        return (year%400==0) || (year%100!=0) && (year%4==0);
    }
    
    public String toString() 
    {
        return this.year+"-"+this.month+"-"+this.day;
    }
    
    public void print() 
    {
        System.out.println("date is "+this.toString());
    }
}

class Date2_ex                                   //其他类,默认访问权限
{
    public static void main(String args[]) 
    {
        Date2 aday1 = new Date2();               //默认参数的构造方法
        Date2 aday2 = new Date2(2006,2,28);      //已知参数的构造方法
        Date2 aday3 = new Date2(aday2);          //由已知对象创建新对象
        aday3.set(2007,12,31);                   //改变当前对象的值,不改变aday2的值
        aday1.print();
        aday2.print();
        aday3.print();
        
        Date2 aday4 = aday1.daysAfter(1);        //返回新创建的对象
        aday4.print();
        
        aday1.tomorrow();                        //改变当前对象的值
        aday1.print();

        System.out.println("aday4.equals(aday1)  "+aday4.equals(aday1));
                                                 //比较两个对象的值
    }
}

/* 
程序运行结果如下:
date is 2006-1-1
date is 2006-2-28
date is 2007-12-31
date is 2006-1-2
date is 2006-1-2
aday4.equals(aday1)  true


*/
/*
程序正确:


程序错误:

1、声明了有参数的构造方法后,没有重载Date2()时,原先无参数的构造方法则无效了。
        Date2 aday = new Date2();             //编译错,cannot find symbol symbol  : constructor Date2()

    public void setDate(Date2 aday)              //公有的成员方法,设置日期值,重载
    {
        this(aday.year, aday.month, aday.day);   //编译错,不能使用this(),call to this must be first statement in constructor
    } 

    public String toString() 
    {
        return this.year+'-'+this.month+'-'+this.day;//编译错,应该用"",incompatible types,found   : int,required: java.lang.String
    }

2、没有覆盖toString()时不行,输出如下
date is Data2@757aef
date is Data2@d9f9c3等

3、没有覆盖equals()时不行,输出如下
aday4.equals(aday1)  false       //结果错,两个对象的值相同
aday3.equals(aday2)  false       //结果错,由拷贝构造方法创建的另一个对象 


只有两个对象引用同一个对象时,结果才对。例如,
aday3.equals(aday3)  false       //结果正确,同一个对象

或者
        Date2 aday5 = aday2;
aday5.equals(aday2)  false       //结果正确,两个对象引用同一个实例


*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -