Object类详解

本文详细解析了Java中Object类的equals(),hashCode(),toString()以及废弃的finalize()方法,包括它们的用途、行为和重写示例,以及垃圾回收机制如何影响对象的生命周期。
摘要由CSDN通过智能技术生成

equals方法

== 和 equals的对比


== 是一个比较运算符:
  1)== :既可以判断基本类型,又可以判断引用类型;

  2)== :如果判断基本类型,判断的是值是否相等;

  3)== :如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象。

public class Equals01 {
    public static void main(String[] args) {
        A a = new A();
        A b = a;
        A c = b;
        System.out.println(a == c); // ture
        System.out.println(a == b); // ture
        
        B objB = a;
        System.out.println(objB == a); // ture
    }
}
class B{}
class A extends B{}

equals 方法:
  1)是 Object类中的方法,只能判断引用类型;

  2)默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等;比如 Integer、String。

String str1 = new String("equals");
String str2 = new String("equals");
System.out.println(str1 == str2);		// false
System.out.println(str1.equals(str2));	// true


Person p1 = new Person();
p1.name = "equals";

Person p2 = new Person();
p2.name = "equals";

System.out.println(p1 == p2);	// false
// String.equals() 判断的是字符串内容是否相等
System.out.println(p1.name.equals(p2.name));	// ture
System.out.println(p1.equals(p2));	// false

hashcode 方法

  1)提高具有哈希结构的容器的效率;

  2)两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!

  3)两个引用,如果指向的是不同对象,则哈希值是不一样的;

  4)哈希值主要是根据地址号来的!不能完全将哈希值等价于地址;

  5)在集合中,hashCode 如果需要的话,也会重写;

public class HashCode {
    public static void main(String[] args) {
        AA aa1 = new AA();
        AA aa2 = new AA();
        AA aa3 = aa1;

        System.out.println("aa1.hashCode() = " + aa1.hashCode());
        System.out.println("aa2.hashCode() = " + aa2.hashCode());
        System.out.println("aa3.hashCode() = " + aa3.hashCode());
    }
}
class AA{}

运行结果:
在这里插入图片描述

toString方法

基本介绍:

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

// toString方法介绍、toString方法重写
public class ToString {
    public static void main(String[] args) {
        Monster monster = new Monster("小妖怪", "巡山的", 1000);

        // return getClass().getName() + "@" + Integer.toHexString(hashCode())
        // 1) getClass().getName()  全类名(包名+类名)
        // 2) Integer.toHexString(hashCode()) 将对象的hashCode值转成16进制字符串
        System.out.println(monster.toString());
    }
}

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

    public Monster(String name, String job, double sal) {
        this.name = name;
        this.job = job;
        this.sal = sal;
    }

    // 重写 toString 方法,输出对象的属性
    // 快捷键 alt + insert -> toString
    @Override
    public String toString() {  // 重写后,一般是把对象的属性值输出
        return "Monster{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }
}

重写前运行结果:
在这里插入图片描述
 
重写后运行结果:
在这里插入图片描述
 
当直接输出一个对象时,toString 方法会被默认的调用。

// 例子
	// 会默认调用 monster.toString() 方法
	System.out.println(monster);

 

finalize 方法 (新版被弃用)

 
finalize()

  当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法;
 
  1)当对象被回收时,系统自动调用该对象的 finalize 方法;子类可以重写该方法,做出一些释放资源的操作;

  2)什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用 finalize 方法;

  3)垃圾回收机制的调用,是由系统来决定的,也可以通过 System.gc() 主动触发垃圾回收机制。

  实际开发中,几乎不会运用 finalize,更多是了解。

public class Finalize {
    public static void main(String[] args) {
        Car bwm = new Car("宝马");

        // 这时,car对象就是一个垃圾,垃圾回收器就会回收(销毁)对象;
        // 在销毁对象前,会调用该对象的 finalize 方法;
        // 程序员就可以在 finalize 中, 写自己的业务逻辑代码(比如释放资源: 数据库连接,或者打开的文件...);
        // 如果程序员不重写 finalize,那么就会调用 Object 类的 finalize,即默认处理;
        // 如果程序员重写了 finalize,就可以实现自己的逻辑。
        bwm = null;
		
		System.gc(); // 主动调用垃圾回收器
        System.out.println("");
    }
}

class Car{
    private String name;

    public Car(String name) {
        this.name = name;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("销毁了汽车" + name);
        System.out.println("释放了一些资源...");
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值