目录
一、Object类
1.1 定义与地位
1.2 toString()方法
1.3 equals()方法
1.4 hashcode()方法
一、Object类
1.1 定义与地位
Object类是Java语言中的根类,所有的类(除了Object类)都直接或间接继承自Object。这就意味着在Java中,任何一个对象都可以被看作是Object类的实例。例如:
class MyClass{}
public class Demo1 {public static void main(String[] args) {Object obj = new MyClass();}
}
我们也可以使用Object来接受所有类的对象
class Person{}
class Doctor{}
public class Demo3 {public static void func(Object obj){System.out.println(obj);}public static void main(String[] args) {func(new Person());func(new Doctor());}
}
在帮助文档中我们可以查到Object类中的方法。如下:
我们先来熟悉一下toString()方法、equals()方法和hashcode()方法。
1.2 toString()方法
作用:该方法返回一个字符串,用于描述对象的信息。默认情况下,它返回对象的类名和哈希码(十六进制表示)。例如:
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",12);System.out.println(person);}
}
我们也可以对toString方法进行重写,通常需要在自定义类中,以便返回更有意义的对象信息。
例如:
class Person{public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Test1 {public static void main(String[] args) {Person person = new Person("zhangsan",12);System.out.println(person);}
}
1.3 equals()方法
在Java中,用==进行比较时:
1.如果==左右两侧是基本类型变量,比较的是变量中值是否相同。
2.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同(是否引用同一个对象)。
3.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:
没重写时:
class Point{private int x;private int y;public Point(int x, int y) {this.x = x;this.y = y;}
}
public class Test2 {public static void main(String[] args) {Point point1 = new Point(1,2);Point point2 = new Point(1,2);System.out.println(point1.equals(point2));}
}
重写后:
class Point{private int x;private int y;public Point(int x, int y) {this.x = x;this.y = y;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Point point = (Point) o;return x == point.x && y == point.y;}
}
public class Test2 {public static void main(String[] args) {Point point1 = new Point(1,2);Point point2 = new Point(1,2);System.out.println(point1.equals(point2));}
}
结论:比较对象的内容是否相同时,一定要重写equals()方法。
1.4 hashcode()方法
作用:返回对象的哈希码值。哈希码主要用于在哈希表(如 Java 中的 HashMap 等集合类)中确定对象的存储位置。一般来说,两个相等的对象(根据 equals 方法判断)应该具有相同的哈希码。
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例
代码:
class Student{private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}
}
public class Test3 {public static void main(String[] args) {Student student1 = new Student("zhangsan",15);Student student2 = new Student("zhangsan",15);System.out.println(student1.hashCode());System.out.println(student2.hashCode());}
}
两个对象的hash值不同。
当我们重写hashcode方法之后:
import java.util.Objects;class Student{private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
public class Test3 {public static void main(String[] args) {Student student1 = new Student("zhangsan",15);Student student2 = new Student("zhangsan",15);System.out.println(student1.hashCode());System.out.println(student2.hashCode());}
}
结论:
1、hashcode方法用来确定对象在内存中存储的位置是否相同。
2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的 散列码,进而确定该对象在散列表中的位置。