重写Object类的equals方法和toString方法
一、回顾 == 的使用:
使用在基本数据类型变量和引用数据类型变量中
- 比较基本数据类型,比较两个变量保存的数据是否相等。(不一定类型要相同,char和int也可以比)
- 比较引用数据类型,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
二、equals()方法
-
只能适用于引用数据类型
-
Object类中equals()的定义:
public boolean equals ( Object obj ){ return (this == obj); }
说明:Object类中定义的equals()和 == 的作用是相同的,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
-
String、Data、File、包装类等都重写了equals( )方法。重写后,比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同。
-
通常情况,我们自定义的类会重写equals( ),重写后也可以比较两个对象的“ 实体内容 ” 是否相同。
// 自己重写equals()fangf public boolean equals(Object obj){ // 1.比较两对象的地址是否相等,相等就直接返回true,不需要内容比较 if(this == obj){ return true; } // 2.地址不同,对比两对象类型是否相同 if(obj instanceof Customer){ Customer cust = (Customer)obj; // 3.如果对象类型相同,再比较两个对象的每个属性是否相等 return this.age == cust.age && this.name.equals(cust.name); } // 4.都不同,返回false return false; } // 通过Alt+Insert快捷键,自动重写equals()方法 @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Animal)) return false; Animal animal = (Animal) o; return age == animal.age && Objects.equals(name, animal.name); }
三、toString( )方法
-
当我们输出一个对象的引用时,实际上就是调用了当前对象的toString( ) 方法
-
toString( )方法源码:
public String toString(){ return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
-
String、Date、File、包装类等都**重写了 toString( )**方法,所以在打印使这些类的对象变量时,返回 “ 实体内容 ” 信息。
-
自定义类也可以重写toString( )方法,当打印该类的对象变量时,返回对象内的“实体内容”。
//Custeomers public String toString(){ ruturn "Customer name =" + name +",age = " + age + "]"; }