==和equals
==
1.如果两个变量是基本类型变量,且都是数值类型,则只要两个变量的值相等,就返回true
2.如果两个变量的引用变量,则只用当这两个变量指向同一个对象的时候,才返回true
3.如果一个变量是基本类型变量,另一个是基本类型的包装类,只要值相等也返回true
## equals >没有经过重写的equals方法和==相同,只有当两个引用变量都指向同一个对象的时候才返回true >所以我们需要重写equals方法,来自定义两个引用变量的相等条件。
JAVA核心技术中提供了一个用于比较两个引用变量的值是否相等的重写方案: ```java @override public boolean equals(Object obj) { if (this == obj) return true; //检查是否引用同一对象 if (obj == null) return false; //检查obj是否为null if (getClass() != obj.getClass()) return false;//检查是否属于同一类,即使是子类也认为不相等 // if (!(obj instanceof ClassName)) return false; //比上面那个宽松,子类也认为相等 ClassName other = (ClassName) obj; //类型转化 return field1 == other.field1 //比较基本类型的成员 && Objects.equals(field2, other.field2) //比较引用类型的成员 && ...; } ```
**关于 (1) if (getClass() != obj.getClass()) 和 (2) if (!(obj instanceof ClassName))的选择:**
如果子类中对equals的语义没有改变,那么可以使用(2),否则使用(1)。比如:Student继承于Person,Person只用一个成员变量id(身份证号码)。假如有一个Person对象 p 和一个Student对象 s ,且 s.id==p.id 那么我们可以认为s和p是相等的,毕竟身份证号码相等的两个人肯定是同一个人,所以我们选择(2)。
又如果,Manager继承于Employee,Employee只有一个成员变量salary。这时,有一个Employee的对象e和一个Manager的对象m,且e.salary==m.salary,但是我们并不能说m和e是同一个对象,毕竟工资相同的人不一定是同一个人,所以我们需要选择(1)。