Java是单根继承结构语言,也就是说,Java中所有的类都有一个共同的祖先,这个祖先就是Object类。
如图所示:Object类中的方法
说明:
1、hashCode和equals函数用来判断对象是否相同,
equals()用于确认两个对象是否相同。
hashCode()用于获取对象的哈希值,这个值的作用是检索,具体的作用可以参考这里
哈希值相同的对象不一定equals()
equals()返回true的两个对象一定相同。
equals()通常用来进行比较,在Object类中,它进行了引用的比较,只有引用相同时会返回true,但是这样并不是我们想要的比较的情况,比如字符串的比较是比较每个字符是否相同。
==与equals在Java中经常被使用,大家也都知道==与equals的区别:
==表示的是变量值完成相同(对于基础类型,地址中存储的是值;引用类型则存储指向实际对象的地址;)
equals表示的是对象的内容完全相同,此处的内容多指对象的特征/属性。
public boolean equals(Object obj) {
return (this == obj);
}
由此可见,Object原生的equals()方法内部调用的正是==,与==具有相同的含义。既然如此,为什么还要定义此equals()方法?
equlas()方法的正确理解应该是:判断两个对象是否相等。那么判断对象相等又是什么?
如果自定义的类没有重写equals()方法来重新定义此标尺,那么默认的将是其父类的equals(),直到object基类。
如果按实际需求,对于StudentBean,由实际的业务需求可知当属性id相同时,表示的是同一个Student,即两个Student对象相等。则可以重写equals以重定义Student对象相等。
package com.hlx;
public class Student{
private int id;
private String name;
private int age;
public Student(int id,String name){
this.id =id;
this.name = name;
}
public int getId() {
return id;
public void setId(int id) {
this.id = id;
}
protected String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Student)) {
return false;
}
if (((User) obj).getId() == this.getId()) {
return true;
}
return false;
}
}
测试结果:
Student stu1=new Student(1100,"mike");
Student stu2=new Student(1100,"麦克");
System.out.println(stu1.equals(stu2)); //返回true
因为Student类定义中重写了equals()方法,判断这两个人是不是同一个人,这时只用判断id是否相同即可。
如上重写equals方法表面上看上去是可以了,实则不然。因为它破坏了Java中的约定:重写equals()方法必须重写hasCode()方法。
2、toString()和getClass是可以在运行时获得类。
源代码如下:
public final native Class<?> getClass();
public boolean equals(Object obj) {
return (this == obj);
}
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
3、wait(),wait(long),wait(long,int),notify(),notifyAll()
4、clone()
5、finalize()用于在垃圾回收