Object 类的几个常用方法

    在 Java 中,Object 类是所有类的根类,所有类都直接或间接继承自 Object 类。Object 类提供了几个常用的方法,这些方法可以被所有类继承和重写。所以有必要了解一下 Object 里的几个常用方法:

1.equal

(1)默认用法

默认:Object 类中的 equals() 方法默认使用 == 进行比较,即比较两个对象的引用是否指向同一个内存地址。

代码示例:

public boolean equals(Object obj) {
    return (this == obj);
}

(2)重写用法

重写目的:根据对象的实际内容(属性值)来判断两个对象是否相等

重写示例:在下面的例子里,我们在Person类中重写equal方法,用来判断对象是否完全相同,这时比较的不再是内存地址,而是比较对象的所有属性值是否相等~!

//尝试一下自己重写equal 方法
public class Equal02 {
    public static void main(String[] args) {
        Person person1 = new Person("jack",30,'男');
        Person person2 = new Person("luiso",30,'女');
        Person person3 = new Person("luiso",30,'女');
        //测试
        System.out.println(person1.equal(person2));
        System.out.println(person2.equal(person3));
    }
}
class Person{
    private String name;
    private int age;
    private char gender;
    //构造器
    public Person(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    //get set 方法
    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 char getGender() {
        return gender;
    }
    public void setGender(char gender) {
        this.gender = gender;
    }

    //判断两个Person对象的内容是否相等,
    // 如果两个Person对象的各个属性值都一样,则返回true,反之false
    //重写 object 的equal 方法
    public boolean equal(Object obj){
        //如果形参 obj 就是调用这个方法的对象
        if (this == obj){
            return true;
        }
        //判断 obj 是不是Person类,是才有比较的必要
        if (obj instanceof Person){
            Person person = (Person) obj;//向下转型
            return this.name.equals(person.name) && this.age== person.age && this.gender== person.gender;
            //比较属性并返回
        }
        //如果不是Person类,直接返回false了
        return false;
    }
}

2.hashCode

 1)提高具有哈希结构的容器的效率!
2)两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
3)两个引用,如果指向的是不同对象,则哈希值是不一样的
4)哈希值主要根据地址号来的!,不能完全将哈希值等价于地址,
6)后面在集合中 hashcode 如果需要的话,也会重写

(1)默认用法

默认:Object 类中的 hashCode() 方法返回对象的内存地址的哈希码

示例:如下图,对象直接调用hashCode方法,返回对象的内存地址的哈希码~!

代码

public class HashCode_01 {
    public static void main(String[] args) {
        AA a1 = new AA();
        AA a2 = new AA();
        AA a3 = a1;

        System.out.println("a1.hashCode="+a1.hashCode());
        System.out.println("a2.hashCode="+a2.hashCode());
        System.out.println("a3.hashCode="+a3.hashCode());
    }
}
class AA{};

3.toString

(1)默认用法

默认返回:全类名+@+哈希值的十六进制

示例:

(2)重写用法

重写目的:在子类中常被重写,用来输出对象的属性

重写方法:在 idea 中直接空白处 右键 点击 生成,或快捷键alt+insert;再点击toString即可

重写示例

实现代码

public class ToString_01 {
    /* toString的源码
    1.getClass().getName() 类的全类名(类名+包名)
    2.Integer.toHexString(hashCode() 将对象的hashCode值转成16进制字符串
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
     */
    public static void main(String[] args) {
        Monster monster = new Monster("小妖怪","巡山的",3000);
        //默认返回:全类名+@+哈希值的十六进制
        //重写后输出对象属性
        System.out.println(monster.toString());

        //当直接输出一个对象时,会默认调用toString()
        System.out.println(monster);

    }
}
class Monster{
    private String name;
    private String job;
    private double sal;

    //toString 常在子类中被重写,用于输出对象的属性
    //可使用快捷键 ALT+insert

    @Override
    public String toString() {
        return "Monster{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }

    //构造器
    public Monster(String name, String job, double sal) {
        this.name = name;
        this.job = job;
        this.sal = sal;
    }
    //
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public double getSal() {
        return sal;
    }

    public void setSal(double sal) {
        this.sal = sal;
    }
}

4.finalize

(1)默认用法

默认:对象被销毁前,系统自动调用该对象的finalize方法,如果不重写,什么都不会发生。

示例:

(2)重写用法

重写目的:在对象被垃圾回收之前执行一些清理操作,例如释放资源,数据库连接,打开文件...

重写示例

但是运行后却发现什么都没有,这是因为垃圾回收有自己的机制,不会立马回收,在要回收该对象时,才会执行我们重写的finalize方法~!

实现代码

//简单介绍一下 finalize 方法
//当对象被回收时,系统自动调用该对象的finalize方法
//子类可以重写该方法,做一些释放资源的操作
public class finalize_ {
    public static void main(String[] args) {
        car car1 = new car("奥迪A6");
        car1 = null;//此时,car1对象就是个垃圾,垃圾回收器会回收(销毁)对象
                    //在销毁对象前,会调用该对象的finalize方法
        //我们就可以在类中重写finalize,写一些业务逻辑(比如释放资源,数据库连接,打开文件...)
        //如果不重写,就默认调用Object类的finalize,默认处理
    }
}
class car{
    private String name;
    //构造
    public car(String name) {
        this.name = name;
    }

    //重写finalize
    @Override
    protected void finalize() throws Throwable {
        System.out.println("销毁了car"+name);
        System.out.println("释放了资源");
        //但是运行后没有出现,因为垃圾回收有自己的机制,不会立马回收
    }
}

小总结

========结束========================

求评论~

求点赞~~~!

求收藏~~~~~~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值