Object类

Object类是所有Java类的祖先(根基类)。每个类都使用了Object作为超类(父类)。所有对象(包括数组)都实现这个类的方法。

如果在类的声明当中未使用extends关键字来指明其基类,则默认的基类就为Object类。

比如我们随便写一个类:
public class Person{ } ==》 public class Person extends Object{ }

在这里我就简简单单的说toString()和equals()方法。

toString()方法

老规矩,先看代码演示:

java 基类 private override java基类方法_父类

这样的结果,就值的我们去思考一下下。

就是在使用System.out.println(person)时,做输出的时候,默认是使用了一个toString的方法。

而我们所调用的类当中并没有toString类,所以在这就调用了一个Person父类当中的toString()的方法。

父类当中的方法:

java 基类 private override java基类方法_开发语言_02

return getClass().getName() + "@" + Integer.toHexString(hashCode());

getClass调用的是一个包名,getName是类名,hashCode()方法,我们先看源码:

java 基类 private override java基类方法_父类_03

它使用的native,native是本地的意思,这个方法就调用去了操作系统的代码,一般都就是了C/C++语言来写。
而toHexString方法,一看就是一个转16进制的方法。将系统给出的地址转为16进制做一个输出。

而我们默认会调用这个方法,是因为在最后的写javaWeb的时候,用于调试代码作用(一般在封装类都会重写toString的方法)

来一个演示:

java 基类 private override java基类方法_System_04

equals()方法

先看一段代码演示:

java 基类 private override java基类方法_intellij-idea_05

我在这来宣布为什么?真相只有一个,因为重写,是因为重写而造成的。

👓先看对于这个代码:

System.out.println(person1.equals(person2));

在这个代码里面,它调用的是Person类,但是在Person类中并没有写equals方法,所以它就会调用Person的父类中的equals方法,Person也没有指定的父类,那就直接指向了基类(Object类)中的Person方法。

java 基类 private override java基类方法_java_06

在Object类中equals方法直接就使用了“==”的判断符号,那么两个引用类型的解雇必然是不相等的为false。

👓再看第二个比较String的代码:

System.out.println(s1.equals(s2));

这个里面两个比较的是String类。而在String类当中,在String类当中就有重写Object类中的equals方法:

先看源码:

java 基类 private override java基类方法_java_07

这就是String类中就有重写equals方法。通过种种判断(这里就粗略说一下,将String中的字母一个一个的拿出来,经过判断得出结果)得到结果,实现了String虽是引用类型,但是经过equals方法判断后,结果为True。


好了,介绍到这里,我们尝试来改一下Person类里面的方法,使得在它的类里面也重写equals方法,使得结果像String类一样,达到我们想要的结果:

重写后的Person方法:

import java.util.Objects;

public class Person {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return name.equals(person.name) &&
                age.equals(person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

再次调用我们上面写的代码:

java 基类 private override java基类方法_父类_08

显然也达到了我们想要的预计结果了。

来,我们再看看其他基本数据类型的包装类:

这个是Integer里面的equals方法。

java 基类 private override java基类方法_父类_09

这个是Double里面的equals方法。

java 基类 private override java基类方法_System_10

等等,就不再这一一列举其他基本数据类型的包装类。

最后来让我们总结一下

在Object类当中有定义到:
public boolean equals (Object obj)方法
在这个里面定义的是一个“==” 的逻辑,就是直接判断的是否地址直接相等。

在JDK当中,几乎所有的所提供的类都有重写Object类中的equals()方法,比较的就是对象当中所包含的内容是否相等。
相同就返回true,否就是false。


本篇博客就到此为止了,感谢你的阅读。
这也是我重读javase基础的一个系列,比起当时初学的时候,现在看问题多了个高度,理解什么也相对轻松一点全面一些。但毕竟学过时间也较长,有什么不对和漏缺的地方,希望大家指出。
欢迎大家在评论区讨论。