Object类
Object类是所有Java类的祖先(根基类)。每个类都使用了Object作为超类(父类)。所有对象(包括数组)都实现这个类的方法。
如果在类的声明当中未使用extends关键字来指明其基类,则默认的基类就为Object类。
比如我们随便写一个类:
public class Person{ } ==》 public class Person extends Object{ }
在这里我就简简单单的说toString()和equals()方法。
toString()方法
老规矩,先看代码演示:
这样的结果,就值的我们去思考一下下。
就是在使用System.out.println(person)时,做输出的时候,默认是使用了一个toString的方法。
而我们所调用的类当中并没有toString类,所以在这就调用了一个Person父类当中的toString()的方法。
父类当中的方法:
return getClass().getName() + "@" + Integer.toHexString(hashCode());
getClass调用的是一个包名,getName是类名,hashCode()方法,我们先看源码:
它使用的native,native是本地的意思,这个方法就调用去了操作系统的代码,一般都就是了C/C++语言来写。
而toHexString方法,一看就是一个转16进制的方法。将系统给出的地址转为16进制做一个输出。
而我们默认会调用这个方法,是因为在最后的写javaWeb的时候,用于调试代码作用(一般在封装类都会重写toString的方法)
来一个演示:
equals()方法
先看一段代码演示:
我在这来宣布为什么?真相只有一个,因为重写,是因为重写而造成的。
👓先看对于这个代码:
System.out.println(person1.equals(person2));
在这个代码里面,它调用的是Person类,但是在Person类中并没有写equals方法,所以它就会调用Person的父类中的equals方法,Person也没有指定的父类,那就直接指向了基类(Object类)中的Person方法。
在Object类中equals方法直接就使用了“==”的判断符号,那么两个引用类型的解雇必然是不相等的为false。
👓再看第二个比较String的代码:
System.out.println(s1.equals(s2));
这个里面两个比较的是String类。而在String类当中,在String类当中就有重写Object类中的equals方法:
先看源码:
这就是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);
}
}
再次调用我们上面写的代码:
显然也达到了我们想要的预计结果了。
来,我们再看看其他基本数据类型的包装类:
这个是Integer里面的equals方法。
这个是Double里面的equals方法。
等等,就不再这一一列举其他基本数据类型的包装类。
最后来让我们总结一下
在Object类当中有定义到:
public boolean equals (Object obj)方法
在这个里面定义的是一个“==” 的逻辑,就是直接判断的是否地址直接相等。
在JDK当中,几乎所有的所提供的类都有重写Object类中的equals()方法,比较的就是对象当中所包含的内容是否相等。
相同就返回true,否就是false。
本篇博客就到此为止了,感谢你的阅读。
这也是我重读javase基础的一个系列,比起当时初学的时候,现在看问题多了个高度,理解什么也相对轻松一点全面一些。但毕竟学过时间也较长,有什么不对和漏缺的地方,希望大家指出。
欢迎大家在评论区讨论。