今天是第二十一天,学习了toString与equals的使用两者可能都需要方法的重写。
要注意equals与==的区别
1. Object类的说明 > 明确:java.lang.Object > 任何一个Java类(除Object类)都直接或间接的继承于Object类 > Object类称为java类的根父类 > Object类中声明的结构(属性、方法等)就具有通用性。 > Object类中没有声明属性 > Object类提供了一个空参的构造器 > 重点关注:Object类中声明的方法 2. 常用方法 重点方法:equals() \ toString() 了解方法:clone() \ finalize() 目前不需要关注:getClass() \ hashCode() \ notify() \ notifyAll() \ wait() \ wait(xx) \ wait(xx,yy) 面试题:final 、 finally 、 finalize 的区别 3. equals()的使用 3.1 适用性: 任何引用数据类型都可以使用。 3.2 java.lang.Object类中equals()的定义: public boolean equals(Object obj) { return (this == obj); } 3.3 equals子类使用说明: > 自定义的类在没有重写Object中equals()方法的情况下,调用的就是Object类中声明的equals(),比较两个 对象的引用地址是否相同。(或比较两个对象是否指向了堆空间中的同一个对象实体) > 对于像String、File、Date和包装类等,它们都重写了Object类中的equals()方法,用于比较两个对象的 实体内容是否相等。 3.4 开发中使用说明: > 实际开发中,针对于自定义的类,常常会判断两个对象是否equals(),而此时主要是判断两个对象的属性值是否相等。 所以:我们要重写Object类的equals()方法。 > 如何重写: > 手动自己实现 > 调用IDEA自动实现(推荐) 3.5 高频面试题: 区分 == 和 equals() ==:运算符 ①使用范围:基本数据类型、引用数据类型 ② 基本数据类型:判断数据值是否相等 int i1 = 10; int i2 = 10; sout(i1 == i2);//true char c1 = 'A'; int i3 = 65; sout(c1 == i3);//true float f1 = 12.0F; int i4 = 12; sout(f1 == i4);//true 引用数据类型变量:比较两个引用变量的地址值是否相等。(或比较两个引用是否指向同一个对象实体) equals():方法 > 使用范围:只能使用在引用数据类型上。 > 具体使用:对于类来说,重写equals()和不重写equals()的区别。 4. toString()的使用 4.1 Object类中toString()的定义: public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 4.2 开发中的使用场景 > 平时我们在调用System.out.println()打印对象引用变量时,其实就调用了对象的toString() 4.3 子类使用说明: > 自定义的类,在没有重写Object类的toString()的情况下,默认返回的是当前对象的地址值。 > 像String、File、Date或包装类等Object的子类,它们都重写了Object类的toString(),在调用toString()时, 返回当前对象的实体内容。 4.4 开发中使用说明: > 习惯上,开发中对于自定义的类在调用toString()时,也希望显示其对象的实体内容,而非地址值。这时候,就需要重写Object 类中的toString().
这是toString的实例
/**
* ClassName:ToStringTest
* Description:
*
* @Author Qinmei
* @Create2023/10/24 21:27
* @Version 17.0.6
*/
public class ToStringTest {
public static void main(String[] args) {
User u1 = new User("Tom",12);
System.out.println(u1.toString());//com.atguigu07.object.tostring.User@1b6d3586 --> User{ name = Tom, age = 12}
System.out.println(u1);//com.atguigu07.object.tostring.User@1b6d3586 -> User{ name = Tom, age = 12}
String s1 = new String("hello");
System.out.println(s1.toString());
File file = new File("d:\\abc.txt");
System.out.println(file);
Date date = new Date();
System.out.println(date);
}
}
class User{
String name;
int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
//手动实现toString()
// @Override
// public String toString() {
// return "User{ name = " + name + ", age = " + age + "}";
//
// }
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
给出Account的equals实例
/**
* ClassName:Account
* Description:
*
* @Author Qinmei
* @Create2023/10/24 19:37
* @Version 17.0.6
*/
public class Account {
private double balance;//余额
public Account() {
}
public Account(double balance) {
this.balance = balance;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Account account = (Account) o;
return Double.compare(account.balance, balance) == 0;
}
}
import java.util.Objects;
/**
* @author shkstart
* @create 9:44
*/
public class Customer {
private String name;
private int age;
private Account acct;
public Customer() {
}
public Customer(String name, int age, Account acct) {
this.name = name;
this.age = age;
this.acct = acct;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Account getAcct() {
return acct;
}
public void setAcct(Account acct) {
this.acct = acct;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Customer customer = (Customer) o;
return age == customer.age && Objects.equals(name, customer.name) && Objects.equals(acct, customer.acct);
}
}
/**
* 说明:判断两个Customer对象是否equals(),除了Customer类需要重写equals()之外,其内部的类类型的属性
* 所在的类,也需要重写equals()
*
* @author shkstart
* @create 9:45
*/
public class CustomerTest {
public static void main(String[] args) {
Customer c1 = new Customer("Tom",12,new Account(2000));
Customer c2 = new Customer("Tom",12,new Account(2000));
System.out.println(c1.equals(c2));//false -->true
}
}