Java学习——常用类的学习之Object

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);
    }

猜你喜欢

转载自blog.csdn.net/qq_43411550/article/details/89481652