目录
一,什么是Object类
Object类是JAVA默认提供的一个类,Object类是所有子类的父类,所有类都可以向上转型为Object类,这时候,有人会问一个子类不是只能继承一个父类吗,如果一个子类A已经继承了一个父类B,那么Object类怎么能成为子类A的父类呢?那是因为父类B默认继承了Object类,所以子类A继承父类B的同时也继承了Object类。(当发生多层继承的时候,就是一层一层往上叠,总用一个类没有继承任何类,那么它就会默认继承Object类)。例如:
//A类默认继承了Object类
class A{
public int a = 10;
}
//B类继承A类,所以B类也继承了Object类
class B extends A{
public String B;
}
public class Test {
public static void main(String[] args) {
Object o1 = new A();//向上转型
Object o2 = new B();//向上转型
}
}
二,Object类中的方法
2.1 toString()方法
我们先来看看以下代码及其执行结果:
class Person{
public String name = "zhangsan";
public int age = 10;
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person);
}
}
那么为什么会输出 (包名)+ 类名 + “@” + 一串字符(使用哈希法处理过的地址值) 这种结果呢?那是因为我们在使用 System.out.println() 时,会调用 toString方法,而Object类中的toString()方法实现如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
因此当我们想要它输出的是 姓名 + 年龄 时,我们就需要重写该方法,例如:
class Person{
public String name = "zhangsan";
public int age = 10;
@Override
public String toString() {
return "Person{" + "name=" + name + ", age=" + age + '}';
}
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person);
}
}
2.2 equals()方法
在Java中,使用==进行比较时:
1.如果==左右两侧是基本类型变量,比较的是变量中值是否相同,例如:
public class Test2 {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a == b);
}
}
2.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同,例如:
class Person{
public String name;
public int age;
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person();
Person person1 = new Person();
System.out.println(person == person1);
}
}
3.如果要比较对象中内容,就要使用Object中的equals方法,例如:
class Person{
public String name;
public int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person("zhangsan",10);
Person person1 = new Person("zhangsan",10);
System.out.println(person.equals(person1));
}
}
但是我们得到的结果依然是 false 为什么呢?因为equals方法默认也是按照地址比较的
// Object类中的equals方法
public boolean equals(Object obj) {
return (this == obj); // 使用引用中的地址直接来进行比较
}
因此如果我们想按照对象中内容来比较,必须重写Object中的equals方法,比如我想要按照人的姓名和年龄来判断是否相等:
import java.util.Objects;
class Person{
public String name = "zhangsan";
public int age = 10;
public Person(String name, int age){
this.name = name;
this.age = age;
}
//重写
@Override
public boolean equals(Object o) {
if (this == o) //判断两者的是否是同一个引用,即地址是否相等
return true;
if (o == null)//判断o是不是空
return false;
if (!(o instanceof Person))//判断类型是否相等
return false ;
Person person = (Person) o;//向下转型,因为父类无法调用子类的成员
return age == person.age && Objects.equals(name, person.name);
}
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person("zhangsan",10);
Person person1 = new Person("zhangsan",10);
System.out.println(person.equals(person1));
}
}
2.3 hashcode()方法
该方法的源码是:
public native int hashCode();
底层由C/C++实现,我们无法看到,但它的作用是得到一个虚拟的地址(真实的地址经过哈希处理得到),例如:
import java.util.Objects;
class Person{
public String name;
public int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person("zhangsan",10);
Person person1 = new Person("zhangsan",10);
System.out.println(person.hashCode());
System.out.println(person1.hashCode());
}
}
如果我们要将两个名字相同,年龄也相同的人当成同一个人,也就是说将其放入同一块空间内,我们就需要重写 hashcode()方法,例如:
import java.util.Objects;
class Person{
public String name = "zhangsan";
public int age = 10;
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Test1 {
public static void main(String[] args) {
Person person = new Person("zhangsan",10);
Person person1 = new Person("zhangsan",10);
System.out.println(person.hashCode());
System.out.println(person1.hashCode());
}
}