认识Object类

概述

Object类是所有类的父类,每个类都直接或间接继承自该类。使用Object可以接收任意的引用数据类型。

Object类中的常用方法

之前我们说过,子类会继承父类的所有方法。不懂的可以看这一章类的继承,又因为Object是所有类的父类,所以

所有类(包括数组)都实现了如下方法。

方法名 方法说明
equals() 返回当前调用的对象和另一个对象是否"相等"的布尔值
getClass() 返回此对象的运行时类
hashCode() 返回该对象的哈希码值
toString() 返回该对象的字符串表示

我们先讲两个简单的方法。

1. toString()方法

通过一个例子演示该方法的使用
先创建一个类:

public class Employee {
    public Employee(){}
}

测试类代码如下:

public class Test {

    public static void main(String[] args) {
        Employee e1 = new Employee();
        System.out.println(e1.toString());
    }

}

运行结果如下:

如图所示,该方法输出了对象的基本信息。

但在实际开发中,通常希望返回的是一些特定的信息,重写toString()方法即可实现。

之前在类的继承时说过,重写父类方法,子类中重写方法的定义格式必须与父类方法的定义格式完全一样,所以我们只需记住这样的格式即可:

public class Employee {
    public Employee(){}
    //重写Object类的toString()方法
    public String toString(){
        return "这是一个Employee类";
    }
}

测试类代码不变,运行结果如下:

这是一个Employee类

通过重写toString()方法,我们就可以返回我们想要的特定信息。

2. equals()方法

通过一个例子演示该方法的使用,
创建一个类

public class Employee {
    private int id;
    private String name;
    private String firm;

    public Employee(){}

    public Employee(int id,String name,String firm){
        setName(name);
        setFirm(firm);
    }

    public int getId(){
        return id;
    }

    public void setId(int id){
        this.id = id;
    }

    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }

    public String getFirm(){
        return firm;
    }

    public void setFirm(String firm){
        this.firm = firm;
    }
}

测试类代码如下:

public class Test {

    public static void main(String[] args) {
        Employee e1 = new Employee(1,"熊大","东京方");
        Employee e2 = new Employee(1,"熊大","东京方");
        System.out.println(e1.equals(e2));
    }

}

运行得到的结果如下:

false

一般来说,两个对象的所有属性相同,就认为它们是同一个对象。但使用equals()方法比较返回的是false,表明它们不是一个对象,这不是我们想要的结果。
之所以不认为它们两个是同一对象,很简单,且看Object类中定义的equals()方法源码:

    public boolean equals(Object obj) {
        return (this == obj);//this指代当前方法的调用对象
    }

我们可以看到,方法源码的内在逻辑就是使用判断相等的比较运算符进行比较两个对象

如果使用"=="判断引用数据类型,不会比较值的大小,而是比较内存地址是否相同。

而每次使用new创建对象都会开辟新的内存空间,都有不同的内存地址

比较内存地址的方式显然无法满足需求,我们需要重写equals()方法。

分析对象相同的条件:

  1. 两对象内存地址相同,一定是同一个对象。
  2. 如果传入的对象为空,一定不是同一个对象。
  3. 如果两对象内存地址不同,判断两对象是否是同一类型。
  4. 如果是同一类型,那么比较属性值是否完全相同。

根据上述条件,我们可以重写equals()方法,代码如下:

    public boolean equals(Object obj){
        if (this == obj)
            return true;

        if (obj == null )
            return false;

        if (obj instanceof Employee){
            Employee o = (Employee)obj;
            if (this.id == o.id && this.name.equals(o.name) && this.firm.equals(o.firm)){
                return true;
            }
        }else{
            return false;
        }
        return false;
    }

我们再运行代码,得到了正确的结果。

posted on 2021-10-07 19:48  技术小伙伴  阅读(87)  评论(0)    收藏  举报