这个程序为什么返回FAISE啊??

syzsk 2006-01-07 07:37:12
class Student
{
int age;

public static void main(String[] args)
{


Student p=new Student();
Student q=new Student();
p.age=13;
q.age=13;

if(p.equals(q))
System.out.println("p 与 q 相等");
else
System.out.println("p 与 q 不等");
}
}


...全文
88 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeffaple 2006-01-09
  • 打赏
  • 举报
回复
对,没有写equals(),默认是比较句柄,看Object里面那个equals方法,所以是false
sam_KING 2006-01-09
  • 打赏
  • 举报
回复
equals()的 默认行为是比较句柄,如果要比较自建类则必须重写 equals()

摘自 Thinking In Java
mqy007 2006-01-07
  • 打赏
  • 举报
回复
回复人: yuzl32(Hello!有酒醉) ( ) 信誉:100 2006-01-07 19:52:00 得分: 0


很明显Student q,p 不是同一对象.所以为false



---------------------------
同上
didoleo 2006-01-07
  • 打赏
  • 举报
回复
--摘自什么地方忘了.

1.重写equals()和hashCode()
当真正需要了解两个引用是否完全相同时,使用==。但是,当需要了解对象本身是否相等时,使用equals()。实际上是要比较两个不同对象的内容在意义上是否等价,除了String类和封装器类(已重写了equals()),需要重写equals().Object内的equals()的方法只使用==运算符进行比较,因此,除非重写equals(),否则只有当两个引用引用相同的对象时,这两个对象才被看做是相等的。另外,如果要使类对象能够用作散列表的键(或者任何数据结构中用于搜索和/或检索对象的元素),则必须重写equals(),使两个不同实例能够被看做是相同的。
我们一般这样重写:
public boolean equals(Object o) {
if(o instanceof Moof) && ((Moof)o).getMoofValue() == this.moofValue)) {
return true;
} else {
return false;
}
}
上面执行了两个操作:
1)确保所测试对象的类型是正确的!用instanceof
2)比较我们关心的属性
注意: equals()、hashCode()和toString()方法都是公有的。下面这种重写是无效的,
class Foo {
boolean equals(Object o) { }
}
一定还要注意参数类型。下面方法是对equals()方法的重载,而不是重写。
class Foo {
public boolean equals(Foo b) { }
}
一定要非常熟悉重写规则,要能够识别类中对Object方法的重写、重载还是非法重新声明。在Foo类中,equals()方法把参数从Object修改为Foo,因此,它是一个重载方法,除非从你自己的代码(它知道这个新的不同方法,而且碰巧被命名为equals)中调用,否则,它不会被调用。
java API中,在equals()方法内定义了一种约定。java约定是一套应该遵守的规则,或者说是想提供其他人所期望的“正确”设计时必须要遵守的内容。有5点:
1.自反性: x.equals(x)应该返回true;
2.对称性:当且仅当y.equals(x)返回true时,x.equals(y)才返回true。
3.可传递性
4.一致性
5.任何非空引用值x,x.equals(null)应该返回false.
如果使用equals()方法,两个对象被认为是相等的,则它们必须具有相同的散列码值。因为Object类的默认散列码总是为每个对象产生一个唯一号,即使重写的equals()方法认为两个或多个对象是相等的,也是这样。所以,为了安全起见,如果重写equals(),一定也要重写
hashCode().
didoleo 2006-01-07
  • 打赏
  • 举报
回复
如果你认为两个student的年龄相等就算这两个对象相等的,没问题,但你要重写equals()方法.
yuzl32 2006-01-07
  • 打赏
  • 举报
回复
很明显Student q,p 不是同一对象.所以为false
yuzl32 2006-01-07
  • 打赏
  • 举报
回复
上面说的不确切!
确定地说,任何非null的引用x、y,若让x == y ,那么它们应该指想同一对象.
(that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true)
yuzl32 2006-01-07
  • 打赏
  • 举报
回复
hashCode 不同!

System.out.println("p.hashCode():"+p.hashCode());
System.out.println("p.hashCode():"+q.hashCode());

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧