package com.javase.进阶.equals;
/**
* equals()方法
* - equals()方法是老祖宗Object类中的方法,是用来判断两个引用数据类型对象是否相等。
* - 以后所有自定义类的equals()方法都需要重写,因为Object类中的equals()方法比较的是两个对象的内存地址,
* 而我们应该比较的是两个对象的内容,所以需要重写equals()方法。
*
* - 重写规则:自己定,主要看是什么和什么相等时表示两个对象相等。
*
* - String类是SUN编写的,所以String类的equals()方法肯定也重写了。
* 以后判断两个字符串是否相等,最好不要使用"==",而是要调用字符串对象的equals()方法。
* 如果是直接赋值的,比如:
* String s1 = "abc";
* String s2 = "abc";
* 此时判断s1与s2是否相等可以使用"==";
* System.out.println(s1 == s2); //该行代码输出结果是true
* 如果字符串对象是"new"出来的,比如:
* String s3 = new String("abc");
* 这时你再判断s1与s3是否相等
* System.out.println(s1 == s3); //该行代码输出结果是false
*
* 所以为了确保安全准确,今后比较字符串是否相等的时候统一使用equals()方法
*
* - 注意:重写equals()方法的时候要彻底。(也就是说所有你自定义的类都有需要根据需要重写equals()方法)
*
* 结论:在重写equals()方法的时候或编程的时候记住以下规矩:
* java中基本数据类型比较是否相等使用"=="
* java中所有的引用数据类型判断是否相等统一使用"equals()"
*/
public class Student {
// 学号
private int no;
// 所在学校
private String school;
// 无参构造方法
public Student() {
}
// 有参构造方法
public Student(int no, String school) {
this.no = no;
this.school = school;
}
// set and get 方法
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
// 重写toString()方法
@Override
public String toString() {
return "学号:" + no + ",所在学校:" + school;
}
// 重写equals()方法
public boolean equals(Object o){
//"o == null"表示引用"o"是空;"!(o instanceof Student)"表示引用o不是Student类型,这两种情况肯定不相等,所以返回false
if (o == null || !(o instanceof Student)) {
return false;
}
//"this == o"表示两个对象的内存地址相等,既然内存地址相等,表示是同一个对象,一定相等,所以返回true
if (this == o){
return true;
}
//程序执行到此表示引用"o"一定是Student类型,所以可以直接向下转型。
//注意:这里的引用"o"必须要向下转型,因为是调用子类特有的属性,父类没有这个属性不能直接用引用"o"去调用
// 也就是说:不能直接"no == o.no"也不能直接"school.equals(o.school)"
Student s = (Student)o;
//以下代码比较基本数据类型使用"==",比较引用数据类型使用"equals()"
//no是基本数据类型,比较时使用"==";school是"String"类型,它属于引用数据类型,比较时使用equals()方法
//"no == s.no && school.equals(s.school)"的运行结果一定是boolean类型其结果只有两种分别是:true或false
return no == s.no && school.equals(s.school);
}
}
class StudentText{
public static void main(String[] args) {
Student s1 = new Student(11111,"抚宁一中");
Student s2 = new Student(11111,"抚宁一中");
System.out.println(s1 == s2);//false "=="比较的是内存地址
System.out.println(s1.equals(s2));//true equals()比较的是内容
}
}