本文共 3136 字,大约阅读时间需要 10 分钟。
我们都知道object类是我们所有类的顶层父类,那么今天我们就来学习一下objec类中的四个常用的方法
- public final Class getClass() - public int hashCode() - public String toString() - public boolean equals(Object obj)官方文档给出的解释是:返回此 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
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 */
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()方法
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); }
转载地址:http://nxiwi.baihongyu.com/