黑马程序员技术交流社区
标题:
程序的运行结果有点不明白啊
[打印本页]
作者:
ゞ心痛-τ._煩離
时间:
2013-10-20 22:18
标题:
程序的运行结果有点不明白啊
本帖最后由 ゞ心痛-τ._煩離 于 2013-10-21 10:09 编辑
class MyDate{
int day,month,year;
public MyDate(int i,int j,int k){
day = i;
month = j;
year = k;}
}
class MyOkDate extends MyDate{
public MyOkDate(int i, int j, int k){
super (i,j,k);
}
public boolean equals(Object obj){
if (obj instanceof MyOkDate){MyOkDate m = (MyOkDate)obj;
if (m.day==day && m.month==month && m.year==year)
return true;
}
return false;
}
}
public class TestEqualsObject{
public static void main(String[] args){
MyDate m1 = new MyDate(24,3,2001);
MyDate m2 = new MyDate(24,3,2001);
System.out.println(m1.equals(m2));
m1 = new MyOkDate(24,3,2001);
m2 = new MyOkDate(24,3,2001);
System.out.println(m1.equals(m2));
}
}
复制代码
结果是:false
true
我不明白第一个为什么是false啊,各位指教指教啊
作者:
流行语
时间:
2013-10-20 22:57
第一个为false,因为m1.equals(m2)时,实际比较的是m1和m2引用地址。
public boolean equals(Object obj) {
return (this == obj);
}
复制代码
你没有覆盖equals方法时,调用的是Object类中的equals方法,而m1和m2是不同的对象,所以是false。
第二个为true是因为你覆盖了Object的equals方法,所以调用时比较的就是对象的内容,而不是引用的地址。
作者:
只想要一盏灯
时间:
2013-10-20 22:59
这里你应该注意 equals 和 == 的区别
== ,用于数值比较,比较的是两个字符串的空间地址值
equals,用于内容的比较,比较两个字符串的内容是否相等
MyDate m1 = new MyDate(24,3,2001);
MyDate m2 = new MyDate(24,3,2001);
因为你new了两个对象,此时,堆内存分别出现了相对应的两个空间地址值,
所以你在这一步public boolean equals(Object obj)判断时,直接两个不同的空间地址值的比较,所以会返回false。
作者:
忄雾飞扬
时间:
2013-10-20 23:00
第一个equals返回false是因为你new了两个MyDate对象,调用了Object中的equals进行了比较不是一个对象返回值都为false;
而第二个返回值为true ,是因为你调用了子类内部的的重写了Object的equals方法,进行比较,所以返回值为true;
作者:
龏鈊づ廱鵆ぐ
时间:
2013-10-20 23:06
MyDate没有覆盖equals()方法,所以比较是是引用故不相等。false
public boolean equals(Object obj){
if (obj instanceof MyOkDate){MyOkDate m = (MyOkDate)obj;
if (m.day==day && m.month==month && m.year==year)
return true;
比较的是值是否相等所以是true
作者:
寻丶丶觅
时间:
2013-10-20 23:18
本帖最后由 寻丶丶觅 于 2013-10-20 23:36 编辑
我把你的代码修改了一下,把equals方法放到父类里,这样子类继承的就是父类的equals方法,覆盖了Object类中的equals方法。
<blockquote>class MyDate
复制代码
作者:
寻丶丶觅
时间:
2013-10-20 23:37
上一个代码没有显示出来
class MyDate
{
int day,month,year;
public MyDate(int i,int j,int k)
{
day = i;
month = j;
year = k;
}
public boolean equals(Object obj)
{
if (obj instanceof MyOkDate||obj instanceof MyDate)
{
//多态,如果obj是MyDate,也可以强转成其父类,类型提升。
MyDate m = (MyDate)obj;
if (m.day==day && m.month==month && m.year==year)
return true;
}
return false;
}
}
class MyOkDate extends MyDate
{
public MyOkDate(int i, int j, int k)
{
super (i,j,k);
}
}
public class Test2
{
public static void main(String[] args)
{
MyDate m1 = new MyDate(24,3,2001);
MyDate m2 = new MyDate(24,3,2001);
System.out.println(m1.equals(m2));
m1 = new MyOkDate(24,3,2001);
m2 = new MyOkDate(24,3,2001);
System.out.println(m1.equals(m2));
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2