package com.lbj.javase18;
/**
* 关于Object中的equals方法:
*
* Object中的equals方法(核心):
* public boolean equals(o2){
* return(this==obj);//相当于return(o1==o2);中间跟的是双等号==,两边引用地址内存相同则true,不同则false
* }
*
* 因此,Object中的equals方法比较的是两个引用的内存地址
*
* 但是,java对象中的equals方法的设计目的:是判断两个对象是否一样
* @author 14811
*
*/
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Object o1=new Object();//因为所有类都默认继承Object类
Object o2=new Object();
boolean b1=o1.equals(o2);
System.out.println(b1);//false
//例2
Star s1=new Star(100,"张三");
Star s2=new Star(100,"张三");
Star s3=new Star(111,"张三");
System.out.println(s1.equals(s2));//false,同时,这里面调用的是当前对象的equals,所以要在当前对象的类中进行重写
//但是实际结果我们不想看到这种情况的发生,因为id号相同就代表是同一个人的意思
//所以Object中的equals方法也要重写
//再一次编译后就是true了
System.out.println(s2.equals(s3));//false,id号不一致
}
}
//例2
class Star{//默认继承object类
int id;
String name;
//构造方法
public Star(int id,String name){
this.id=id;
this.name=name;
}
//开始重写,到API帮助文档进行复制重写
//需求规定:如果身份证号一致,并且名字也一致,则代表同一个人
//s1.equals(s2);
//相当于 this 和 obj 之间的参数传递比较
public boolean equals(Object obj){//父类型引用指向子类型对象,如果父类型想调用子类型,需要进行强制转换
//int id1=this.id;//这个this.id之所以成立是因为在这个类里面this代表的是Star,因此this包涵有id这个属性
//int id2=obj.id;报错,因为obj里面没有id这个属性
//改正
//先强制类型转换
//Star s=(Star)obj;
//int id2=s.id;
//这里比较内存地址是否相同
if(this==obj)return true;//如果内存地址相同的话,equals也成立的意思
//这里比较内容是否相同
if(obj instanceof Star){//如果obj是Star
Star s=(Star)obj;//强转为同一个类型
if(s.id==this.id&&s.name.equals(name)){//左边的equals是调用String类型里面重写的,比较的是字符串,不是内存地址了
return true;
}
}
return false;
//在java中比较两个字符串是否一致,不能用"==",只能调用String类的equals方法
}
}