Java学习——常用类的学习之Object
我们都知道object类是我们所有类的顶层父类,那么今天我们就来学习一下objec类中的四个常用的方法
- public final Class getClass()
- public int hashCode()
- public String toString()
- public boolean equals(Object obj)
1.getClass()方法
官方文档给出的解释是:返回此 Object 的运行时类。
其实getClass()方法就是返回该类的字节码文件对象,具体是什么意思呢,我们来看一下代码:
Object obj = new Object();
Class clazz = obj.getClass();
System.out.println(clazz);
//输出结果:class java.lang.Object
在使用这个方法是我们应当注意,一个类new出不同对象是,对象于对象是不同的,但是他们的字节码文件对象都是一个,具体如下:
public static void main(String[] args) {
//对象1
Object obj = new Object();
//字节码文件对象1
Class clazz = obj.getClass();
//对象2
Object obj2 = new Object();
//字节码文件对象2
Class clazz2 = obj2.getClass();
System.out.println(obj==obj2); //false
System.out.println(clazz==clazz2);//true
}
//输出结果:false
// true
2.hashCode()方法
hashCode()方法官方文档给出的解释是:返回该对象的哈希码值。
不同对象的哈希码值是不一样的,相同对象的哈希码值是一样的:
public static void main(String[] args) {
//对象1
Object obj = new Object();
int i = obj.hashCode();
System.out.println(i);
//对象2
Object obj2 = new Object();
int i1 = obj2.hashCode();
System.out.println(i1);
}
/* 输出结果:356573597
1735600054
*/
3.toString()方法
toString()方法官方文档给出的解释是:返回该对象的字符串表示。
意思就是说,将该对象的地址值用字符串表现形式表现出来:
public static void main(String[] args) {
Object obj = new Object();
String s = obj.toString(); //获取该对象的地址值的字符串表现形式
System.out.println(s);
}
我们还可以看一下toString()方法的源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
其实它也就是将该对象的字节码文件对象的名称拼上一个“@”符号,再拼上一个哈希值返回。
一般情况下我们不会想要这种表现形式,我们都会选择重写toString方法,让它去帮我们返回该类的成员方法值,重写过后的toString方法如下:
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
当然我们还可以根据自己的需求去重写toString()方法,不用去按照它默认重写的效果,我们还需要注意String类中已经重写过toString()方法了,但是大部分的类和我们自定义的类并没有重写,如果我们有这方面的需求可以选择自己重写toString()方法
4.equals()方法
equals()方法官方文档给出的解释是:指示其他某个对象是否与此对象“相等”。
意思就是比较两个对象是否相等。
public static void main(String[] args) {
Object obj = new Object();
Object obj2 = new Object();
//用“=”比较两个对象是否相等
System.out.println(obj == obj2);
//用equals方法比较两个对象是否相等
boolean b = obj.equals(obj2);
System.out.println(b);
}
/* 输出结果:false
false
*/
结果都是false,我们可以看下equals()的源码:
public boolean equals(Object obj) {
return (this == obj);
}
这样我们就可以看出,原始的equals()方法与“==”所起到的作用是一样的,那么为什么又会有equals()方法呢?
其实,equals()方法不重写之前和 双等号都是比较对象的地址值。我们就想到,重写equals()方法,让他去比较对象的值而不是地址值,那么重写过后的equals()方法就诞生了:
@Override
public boolean equals(Object o) {
//判断是不是该对象本身,如果是直接返回true
if (this == o) {
return true;
}
//判断传过来的对象是不是空,或者字节码文件是否一样
if (o == null || getClass() != o.getClass()) {
return false;
}
//将传来的对象向下转型
Student student = (Student) o;
//判断传来的对象的成员变量值是否与其相同
return age == student.age && Objects.equals(name, student.name);
}