java中users[i].name.equals(name))怎么理解

如题所述

前言
这一篇文章是对java的Object的方法的equals的描述,也包括对重写方法写的一些理解。

一、Object类的equals方法?
1. Object是什么?
首先要明确Object类中有什么,它是什么?
Object类在《java核心技术1》中是这样描述的是Java中所有类的始祖,每个类都是尤其扩展出来的。所以我们创建的类应该都会有应该有这样的表达:

public class Classname extends Object{ }

登录后复制
但其实上公司早已经考虑过这个问题了,所以每个类都是默认继承Object的。所以直接就可以就可以引用Object类中的方法,编译器是不会报错的。

2. equals方法的解析
1、 为什么需要这个方法?
因为传统的逻辑判断“ == ”,是去判断数据在内存堆中地址,基础数据在堆中内存是相同的,所以 “ ==”最后是对数据的值来进行比较的。

2、 equals方法在书上的解析
在《Java核心技术1》中对equals方法的描述是用于检查一个对象是否等于另一个对象,这两个对象是否具有相同的引用。然后接下来我会使用代码,以及代码运行的结果对这个方法进行讲解。

/*
我们创造一个Employee类来验证——一个对象是否等于另一个对象,这两个对象是否具有相同的引用
*/
public class Employee extends Person{
private int salary;
private int worktime;

public Employee(String name, String sex,int salary, int worktime) {
this.name = name;
this.sex = sex;
this.salary = salary;
this.worktime = worktime;
}

/*
现在我们目标是使用equals方法
具体实现是:
1.首先先使用Employee类来进行信息的比对
2.再使用Student类和Employee类进行比对
*/

//step1
Employee employee1 = new Employee("啊狗","男",2000,12);
Employee employee2 = new Employee("啊狗","男",2000,12);
//现在我们创造两个数据皆相同的对象我们现在进行equals方法的判断
System.out.println(employee1.equals(employee2));
登录后复制

终端会给我们输出false,我们可以开调试来看看为什么会输出flase。我们可以看到employee1和employee2地址会不同,这就能解释到《Java核心技术1》对Object类中的equals方法是对比一个对象是否等于另外一个对象。这不仅仅局限于数据的相同,也需要去判断数据存放的地址是否相同。

3. 对上公司的Object类方法的理解
深入的我们可以去看看上公司如何写Object类的equals方法。

public boolean equals(Object obj)
return (this == obj);
}
登录后复制
这里的equals方法接入的是Object类, (this == obj)这句话的意思是当前对象和传入obj地址是否相等,因为 “==”的作用就是比较两者地址是否相同。

4. 对上公司对重写的equals方法的一些理解
那么接下来我们研究方向就是如何让两个数据相同的对象相同,这一点由为之重要。上公司已经非常贴心地为我们重写好了这个方法,我们可以一起看看这个方法地实现。

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return salary == employee.salary && worktime == employee.worktime;
}
登录后复制
if (this == o) return true;
登录后复制
这句话是自反性的体现,先使用this调用当前对象,然后再将对象o放入判断语句中,也就是书中所说的对于非空引用x,x.equals(x)会返回true。

if (o == null || getClass() != o.getClass()) return false;
登录后复制
这句话是将调用getClass()方法,因为两个不同的类不可以做比较,会直接返回false的。具体我们可以利用我们的Student类和Employee类来做比较。

Employee employee1 = new Employee("啊狗","男",2000,12);
Student student = new Student("啊猫","男",18,"智能科学");
//2.再使用Student类和Employee类进行比对
System.out.println(employee1.equals(student));
登录后复制
无论从直观上还是客观上来看,我们都能会觉得终端会输出false,事实如此,确实最后终端是输出了false。

Employee employee = (Employee) o;
登录后复制
这句话又是什么意思呢?这个涉及一个强制类型转化的知识,因为所有类都默认继承或者间接继承Object类,因为前面已经使用getClass方法来判断类是否相同,所以这里不需要进行instanceof来判断两个类是否相同,如果两个类不同的话,直接运行java会抛出ClassExceptionError错误。这一步就是让传入的值获得自己私有得信息,这一个点是涉及多态的缺点的缘由。

return salary == employee.salary && worktime == employee.worktime;
登录后复制
这一句话我们可以通过调试来看看到底相比较的是什么?我们可以看到是将当前对象的salary和worktime的值来和传入对象的salary和worktime的值比较,这样就可以免除“==”比较地址而造成最后的结果和主观感觉不一样的预期。

总结
这篇文章是我第一次写博客,文章结合《java核心技术1》对Object类中的equals方法的一点理解的,本来想写Object类常用API的一个汇总,但是鉴于能力的不足,所以最后仅仅只是写了equals方法的理解。这一次编写博客的过程中,我明显发现自己对很多不理解的地方,本文如果有讲解错误,或者讲解不当的地方,希望大家能指正我的错误,感谢!
温馨提示:答案为网友推荐,仅供参考