Object类概念
Object是Java默认提供的一个类,Object类是所有类的父类,Java里面除了Object类,所有的类都是存在继承关系的。
以下两种定义效果完全一致:
class A{}
class A extends Object{}
由此可得:所有类的对象都可以使用Object的引用进行接收,如下:
public class A {}
public class B extends A{}
public class Test {
Object obj1 = new A();
Object obj2 = new B();
}
Object类中——获取对象信息方法 toString()
如果要打印对象中的内容,可以重写Object类中的toString()方法,如下:
Dog类中没有toString()方法,父类Animal中也没有,所以调用了Object中的toString()方法
我们打开源码可以看到,返回的相当于是一个地址:
所以需要我们自己重写toString()方法:
Object类中——对象比较equals()方法
当两个成员变量的值相同时,运行结果如下:
在比较dog这个引用类型变量时,发现Object类中的equals()方法默认比较的是引用变量的地址
所得结果均为false
想要比较对象中的内容,必须重写object中的equals()方法:
在上述重写的equals()方法中进一步优化,如下:
@Override
public boolean equals(Object obj) {
//判空
if(obj == null){
return false;
}
//是否为同一个对象
if(this == obj){
return true;
}
//不是同一个类型
if(!(obj instanceof Dog)){
return false;
}
Dog tmp = (Dog) obj;//此处方法向下转型
return tmp.name.equals(this.name)
&& tmp.age == this.age;
}
结论:
在Java中,用 == 进行比较时
- 如果 == 左右两侧是基本类型变量,比较的是变量中值是否相同
- 如果 == 左右两侧是引用类型变量,比较的是引用变量地址是否相同
- 如果要比较对象中内容,必须重写Object类中的equals()方法,因为equals()方法默认也是按照地址比较的
Object类中——hashcode()方法
如上所示,hashcode()方法帮我们计算了两个具体的对象位置
hashcode()方法源码是一个native方法,底层是由C/C++代码写的,我们无法看到
假设我们认为两个name、age相同的对象,会储存在同一个位置,如果不重写hashcode()方法,我们可以看到两个对象的hash值并不一样
所以我们可以像重写equals()方法一样,重写hashcode()方法,如下:
@Override
public int hashCode() {
return Objects.hash(name,age);
}
让name、age作为参数生成hash值,当name、age相同时,生成的hash值相同
结论:
- hashcode()方法用来确定对象在内存中存储的位置是否相同
- 事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的 散列码,进而确定该对象在散列表中的位置。
tips:下为Object类中所有方法,应全部掌握!