API
public class Date2 |
private final int value; |
public Date2(int m,int d,int y) 构造函数对参数进行移位存储,初试化变量 public int month() public int day() public int year() public String toString() 重写toString()方法 public boolean equals(Object x) 重写equals()方法 |
package date;
/*封装日期的数据类型的实现*/
public class Date2
{
private final int value;
public Date2(int m,int d,int y)
{
value=(y<<9)+(m<<5)+d; /*一定要有括号 !! value=y*512+m*32+d;*/
} /*移位运算符优先级高于">"低于"—"*/
public int month()
{
return (value>>5)%16; /*value/512%16*/
}
public int day()
{
return value%32;
}
public int year()
{
return value>>9; /*value/512*/
}
/*
* Object类的 toString 方法返回一个字符串,
* 该字符串由类名(对象是该类的一个实例)、at标记符“@”和此对象哈希码的无符号十六进制表示组成。
* 换句话说,该方法返回一个字符串,它的值等于:
* public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
* */
public String toString()
{
return month()+"/"+day()+"/"+year();
}
/*==用于比较引用和比较基本数据类型时具有不同的功能:
*比较基本数据类型,如果两个值相同,则结果为true
*而在比较引用时,如果引用指向内存中的同一对象,结果为true
**/
/*Object类中的equals源码
* public boolean equals(Object obj)
* {
return (this == obj);
}
*/
/*
* equals(),一种等价性关系
* 1、自反性:x.equals(x)返回true;
* 2、对称性:若x.equals(y)为true,则y.equals(x)亦为true;
* 3、传递性:若x.equals(y)为true且y.equals(z)也为true,则x.equals(z)亦为true;
* 4、一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n次调用也均为true,前提条件是没有修改x也没有修改y;
* 5、非空性:x.equals(null)永远返回为false。
* Java为Integer、Double和String等标准数据类型以及一些如File和URL的复杂数据类型提供了实现,
* 在处理这些数据类型时,可以直接使用内置的实现。在定义自己的数据类型时需要重载equals()方法
* */
public boolean equals(Object x)
{
/*
* 检查值是否相同
* 1.该对象和参数对象的引用相同,返回true
* 2.参数为空(null),根据约定返回false
* 3.该对象和参数对象的类不同,返回false
* 4.将参数对象的类从Object转换到自定义的数据类型(Date)
* 5.任意实例变量的值不相同返回false
* */
if(this==x)
return true;
if(x==null)
return false;
if(this.getClass()!=x.getClass())
return false;
Date2 that=(Date2) x;
if(this.day()!=that.day())
return false;
if(this.month()!=that.month())
return false;
if(this.year()!=that.year())
return false;
return true;
}
}