4.7 Object类

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);
   }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WFIT~SKY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值