Object

本文详细介绍了Java中的Object类及其常用方法,包括toString()用于返回对象的字符串表示,equals()用于比较对象内容,以及clone()方法的浅克隆和深克隆示例。通过Student和User类的实例,展示了如何重写这些方法以满足特定需求。
摘要由CSDN通过智能技术生成

Object类的作用

Object类是Java中所有类的父类,所以,Java中所有类的对象都可以直接使用Object类中提供的一些方法

Object类的常见方法

方法名说明
public String toString()返回对象的字符串表示形式
public boolean equals(Object o)判断两个对象是否相等
protected Object clone()对象克隆

案例演示

toString()和equals()

Student类

package com.ligemanyin._Object;

import java.util.Objects;

/**
 * ClassName:Student
 * Package:com.ligemanyin._Object
 * Description:Object常用API演示
 *
 * @Author:离歌慢饮
 * @CreateTime:2024/2/17 15:49
 * @Version:1.0
 */
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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;
    }

    @Override
    public String toString() {
        return "[姓名:" + name + ",年龄:" + age + "]";
    }

    @Override
    public boolean equals(Object o) {
        //判断两个对象地址是否一样,一样则返回true
        if (this == o) return true;
        //判断o如果是null或比较者与被比较者的类型不一样,返回false
        if (o == null || getClass() != o.getClass()) return false;
        //o不为null且o一定是Student对象,则将o转为Student类型并开始比较内容
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
}

测试类StudentTest

package com.ligemanyin._Object;

/**
 * ClassName:StudentTest
 * Package:com.ligemanyin._Object
 * Description:Object中的toString()和equals()方法演示
 *
 * @Author:离歌慢饮
 * @CreateTime:2024/2/17 15:51
 * @Version:1.0
 */
public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student("张三", 22);
        System.out.println(student);

        Student student1 = student;
        Student student2 = new Student("李四", 23);

        System.out.println(student1);   //[姓名:张三,年龄:22]
        System.out.println(student2);   //[姓名:李四,年龄:23]

        System.out.println(student.equals(student1));   //true
        System.out.println(student.equals(student2));   //false

        Student student3 = new Student("李四", 23);
        System.out.println(student2.equals(student3));  //true  根据重写的equals方法判断,其地址并不相同
    }
}

toString存在的意义: toString()方法存在的意义就是为了被子类重写,以便返回对象具体的内容

equals存在的意义: 直接比较两个对象的地址是否相同完全可以用“==”替代equals,equals存在的意义就是为了被子类重写,以便子类自己来制定比较规则(如比较对象内容)

clone()

User类

package com.ligemanyin._Object;

import java.util.Arrays;

/**
 * ClassName:User
 * Package:com.ligemanyin._Object
 * Description:Object中clone()方法演示
 *
 * @Author:离歌慢饮
 * @CreateTime:2024/2/17 16:22
 * @Version:1.0
 */
public class User implements Cloneable{ //Cloneable是一个标记接口,如果要实现clone功能,需实现该接口
    private int id;     //编号
    private String userName;    //用户名
    private String password;    //密码
    private double[] scores;    //分数

    public User() {
    }

    public User(int id, String userName, String password, double[] scores) {
        this.id = id;
        this.userName = userName;
        this.password = password;
        this.scores = scores;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double[] getScores() {
        return scores;
    }

    public void setScores(double[] scores) {
        this.scores = scores;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        //super去调用父类Object中的clone方法
        return super.clone();
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", scores=" + Arrays.toString(scores) +
                '}';
    }
}

测试类UserTest

package com.ligemanyin._Object;

/**
 * ClassName:UserTest
 * Package:com.ligemanyin._Object
 * Description:
 *
 * @Author:离歌慢饮
 * @CreateTime:2024/2/17 16:29
 * @Version:1.0
 */
public class UserTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        User u1 = new User(1, "zhangsan", "123456", new double[] {99.0,99});
        User u2 = (User) u1.clone();

        System.out.println(u1); //User{id=1, userName='zhangsan', password='123456', scores=[99.0, 99.0]}
        System.out.println(u2); //User{id=1, userName='zhangsan', password='123456', scores=[99.0, 99.0]}

        System.out.println(u1.equals(u2));
        System.out.println(u1 == u2);   //克隆后会创建一个新对象出来,所以原对象与克隆对象地址不同
        
        System.out.println(u1.getScores()); //[D@67b6d4ae
        System.out.println(u2.getScores()); //[D@67b6d4ae
        //浅克隆中数组对象会直接拷贝其在堆内存中的地址,所以两个对象的数组地址才会相同
    }
}

浅克隆: 拷贝出的新对象,与原对象中的数据一模一样(引用类型拷贝的只是地址)

重写clone()

package com.ligemanyin._Object;

import java.util.Arrays;

/**
 * ClassName:User
 * Package:com.ligemanyin._Object
 * Description:Object中clone()方法演示
 *
 * @Author:离歌慢饮
 * @CreateTime:2024/2/17 16:22
 * @Version:1.0
 */
public class User implements Cloneable{ //Cloneable是一个标记接口,如果要实现clone功能,需实现该接口
    private int id;     //编号
    private String userName;    //用户名
    private String password;    //密码
    private double[] scores;    //分数

    public User() {
    }

    public User(int id, String userName, String password, double[] scores) {
        this.id = id;
        this.userName = userName;
        this.password = password;
        this.scores = scores;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double[] getScores() {
        return scores;
    }

    public void setScores(double[] scores) {
        this.scores = scores;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        //super去调用父类Object中的clone方法
        User u2 = (User) super.clone();
        //对数组对象进行克隆,即是将创建一个新的数组对象并将值拷贝给该对象,
        // 由此方法得到的数组对象与原数组对象不是同一个地址
        u2.scores = u2.scores.clone();
        return u2;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", scores=" + Arrays.toString(scores) +
                '}';
    }
}

测试类UserTest

package com.ligemanyin._Object;

/**
 * ClassName:UserTest
 * Package:com.ligemanyin._Object
 * Description:
 *
 * @Author:离歌慢饮
 * @CreateTime:2024/2/17 16:29
 * @Version:1.0
 */
public class UserTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        User u1 = new User(1, "zhangsan", "123456", new double[] {99.0,99});
        User u2 = (User) u1.clone();

        System.out.println(u1); //User{id=1, userName='zhangsan', password='123456', scores=[99.0, 99.0]}
        System.out.println(u2); //User{id=1, userName='zhangsan', password='123456', scores=[99.0, 99.0]}

        System.out.println(u1.equals(u2));
        System.out.println(u1 == u2);   //克隆后会创建一个新对象出来,所以原对象与克隆对象地址不同
        System.out.println(u1.getScores()); //[D@67b6d4ae
        System.out.println(u2.getScores()); //[D@34b7bfc0
    }
}

深克隆: 对象中基本类型的数据直接拷贝;对象中的字符串数据拷贝其地址;对象中还包含的其他对象,不会拷贝地址,而是创建新对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离歌慢饮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值