Java提供了一个Object类,它是所有类的父类,每个类都直接或间接继承了Object类,因此Object类通常被称为超类。当定义一个类时,如果没有使用extends关键字为这个类显式地指定父类,那么该类会默认继承Object类。
Object类中定义了一些常用方法,具体如下所示。
方法名称 | 方法说明 |
boolean equals() | 判断两个对象是否“相等” |
int hashCode() | 返回对象的哈希值 |
String toString() | 返回对象的字符串表示形式 |
1. toString方法
调用对象的toString()方法可以返回对象的字符串表示。
(1)类未覆盖toString方法
类未覆盖toString方法,默认返回类名加一个@符号,再加一个十六进制数,例如com.wfit.test.Student@1b6d3586。
Object类的toString方法如下所示。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Student类默认继承Object类,未覆盖toString方法如下所示。
-
Student类
public class Student {
}
-
测试类
public class TestDemo {
@Test
public void test(){
Student student = new Student();
System.out.println(student.toString());
System.out.println(student);
}
}
-
结果
com.wfit.test.Student@1b6d3586
com.wfit.test.Student@1b6d3586
(2)类覆盖toString方法
在实际开发中,通常情况下不会直接调用Object类中的方法,因为Object类中的方法并不能适用于所有的子类,这时就需要对Object类中的方法进行重写,以符合实际开发需求。Student类默认继承Object类,覆盖toString方法如下所示。
-
Student类
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
-
测试类
public class TestDemo {
@Test
public void test(){
Student student = new Student();
student.setName("zhangsan");
System.out.println(student.toString());
System.out.println(student);
}
}
-
结果
Student{name='zhangsan'}
Student{name='zhangsan'}
2. equals方法
equals方法用来比较两个对象是否相等,equals在Object类中的定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
可见,Object中该方法使用“= =”来进行比较的,比较的是两个对象的引用。另外,类也可以覆盖该方法,Java类库中的许多类也覆盖了此方法,如Arrays类和String类等。
(1)Arrays类重写equals方法
Arrays中equals( )方法是从Object类中继承来的,但是String类对equals( )方法进行了重写,使用Arrays的equals( )方法可以比较对应元素是否相同。
Arrays类重写equals方法如下:
public static boolean equals(int[] a, int[] a2) {
if (a==a2)
return true;
if (a==null || a2==null)
return false;
int length = a.length;
if (a2.length != length)
return false;
return ArraysSupport.mismatch(a, a2, length) < 0;
}
public static int mismatch(int[] a,
int[] b,
int length) {
int i = 0;
if (length > 1) {
if (a[0] != b[0])
return 0;
i = vectorizedMismatch(
a, Unsafe.ARRAY_INT_BASE_OFFSET,
b, Unsafe.ARRAY_INT_BASE_OFFSET,
length, LOG2_ARRAY_INT_INDEX_SCALE);
if (i >= 0)
return i;
i = length - ~i;
}
for (; i < length; i++) {
if (a[i] != b[i])
return i;
}
return -1;
}
(2)String类重写equals方法
String中equals( )方法是从Object类中继承来的,但是String类对equals( )方法进行了重写,比较的是字符串的内容。
String类重写equals方法如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
(3)自定义的类重写equals( )方法,比较类的内容。
-
Animal类
public class Animal{
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Animal animal = (Animal) o;
return Objects.equals(name, animal.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
-
测试类
public class TestDemo {
@Test
public void test(){
Animal a1 = new Animal();
Animal a2 = new Animal();
a1.setName("cat");
a2.setName("cat");
boolean flag = a1.equals(a2);
System.out.println(flag);
}
}