Object类中定义的常用方法介绍(&clone &equals &toString &finalize)

本文详细介绍了Java中的Object类,它是所有Java类的父类,提供了equals()、clone()、toString()等基础方法。equals()默认比较对象的引用,但在子类中常重写用于内容比较;clone()用于复制对象,避免影响原对象;toString()返回对象的字符串表示。此外,还探讨了==运算符的作用。通过对这些方法的理解,能更好地掌握Java对象的使用。
摘要由CSDN通过智能技术生成
  • java.lang.Object类

1.Object类是所有Java类的根父类
2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 
3.Object类中的功能(属性、方法)就具有通用性。
 属性:无
 方法:equals() / toString() / getClass() /hashCode() / clone() / finalize() /wait() /notify()/notifyAll()
 4. Object类只声明了一个空参的构造器 

  • clone方法

运用场景

比如:现在有二个对象(a1和a2)如果我们要用a2保存a1对象的数据,但又不希望a2对象数据被改变时不影响到a1。这时候我们就需要用到Java的Object类提供的clone方法。

import java.util.Arrays;

public class CloneTest {
    public static void main(String[] args) {
        Person p = new Person(new int[]{11,22});

        try {
            Person p1 = (Person) p.clone();//将p clone到p1下
            System.out.println("原始对象" + p);
            p1.setAge(new int[]{33,44});
            System.out.println("clone后的对象" + p1);
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
    }
}

class Person implements Cloneable{

    private int age[];

    public Person(){
        age = new int[2];
    }
    public Person(int[] age) {
        this.age = age;
        age = new int[2];
    }

    public int[] getAge() {
        return age;
    }

    public void setAge(int[] age) {
        this.age = age;
    }

    @Override  //重写Object类中的clone方法
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Person{" + "age=" + Arrays.toString(age) + '}';
    }
}

//执行结果:
//原始对象Person{age=[11, 22]}
//clone后的对象Person{age=[33, 44]}

更改关于clone介绍,参看该片文章

  • equals方法

equals()方法的使用:
 1. 是一个方法,而非运算符
 2. 只能适用于引用数据类型
 3. Object类中equals()的定义:
   public boolean equals(Object obj) {
            return (this == obj);
      }
  说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个    引用是否指向同一个对象实体
 4. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是
 两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。  
 5. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写.
重写的原则:比较两个对象的实体内容是否相同.

import java.util.Objects;
public class EqualsTest {
    public static void main(String[] args) {
        Student s1 = new Student("张三",23);
        Student s2 = new Student("李四",24);
        Student s3 = new Student("李四",24);
        System.out.println(s1.equals(s2));
        System.out.println(s3.equals(s2));
        System.out.println(s3 == s2);
    }
}
//执行结果:
//false
//true
//false


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

    //equals方法 写法一:
    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (!(o instanceof Student))
            return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }


    //equals方法 写法二:
    /*@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }*/
}

 == :运算符

1. 可以使用在基本数据类型变量和引用数据类型变量中
2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
补充: == 符号使用时,必须保证符号左右两边的变量类型一致。

  • toString方法

1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
2. Object类中toString()的定义:
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
     }
3. 像String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,返回"实体内容"信息
4. 自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容"

public class ToStringTest {
    public static void main(String[] args) {
        Student s = new Student("张三",23);
        System.out.println(s);
        System.out.println(s.toString());

        String str = new String("字符串");
        System.out.println(str);

        Date d = new Date(12121212L);
        System.out.println(d);
    }
}
//执行结果:
//Student{name='张三', age=23}
//Student{name='张三', age=23}
//字符串
//Thu Jan 01 11:22:01 CST 1970

//class Student类参考上面equals中的Student类,重写的toString方法如下:
public String toString() {
        return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
    }  
  • finalize方法 可在释放对象前进行某些操作

public class FinalizeTest {
    public static void main(String[] args) {
        Student stu = new Student("张三",23);
        stu = null;//此时对象实体就是垃圾对象,等待被回收。但时间不确定。
        System.gc();//强制性释放空间
    }
}

//执行结果:
//对象被释放--->Student{name='张三', age=23}

//class Student类参考上面equals中的Student类,重写的finalize方法如下:

 //子类重写此方法,可在释放对象前进行某些操作
    @Override
    protected void finalize() throws Throwable {
        System.out.println("对象被释放--->" + this);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值