学习Java第21天,toString与equals的使用

本文详细解释了Java中的equals()和toString()方法,包括Object类的基础、两者在Java中的使用场景、自定义类重写的重要性,以及equals()与==的区别。还提供了Account和Customer类的equals()实现示例。
摘要由CSDN通过智能技术生成

今天是第二十一天,学习了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
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值