Java Object类方法介绍

    Object作为顶级类,所有的类都实现了该类的方法,包括数组。
查询Java文档:

1、object.eauqls():

    其作用与 == 有些类似。
==:
    是一个比较运算符,而不是一个方法。
    ①可以判断基本类型,也可以判断引用类型。
    ②若判断基本数据类型,则判断他们的值是否相同。
    ③若判断引用类型,则判断他们的地址是否相同,即判断他们是不是同一个对象。
    ④只要有基本数据类型,那么就是判断值是否相等。
equals:
    是object类中的方法,不是运算符,只能判断引用类型。
    ①默认判断地址是否相同。
    ②子类往往都会将其重写,用来判断对应内容是否相等。
    例:
    这是Object中equals的源码:
    
    Integer类将equals()改写为:
    
例:用== 和equals()来判断两个Integer对象是否相等:
Integer i1 = new Integer(1000);
Integer i2 = new Integer(1000);
i1 == i2;     //false  因为==判断引用类型时,判断他们地址是否相同
i1.equals(i2);//true   而Integer对equals()方法进行重写,所以是判断两个对象的值是否相等,因此正确。

2、hashCode():

1、提高具有哈希结构的容器的效率。
2、两个引用,如果指向的是同一个对象,则哈希值是一样的。
3、两个引用,如果指向的是不同的对象,则哈希值是不一样的。
4、哈希值主要是根据地址号来的,但是不能完全将哈希值等价于地址。
5、Object的hashcode 方法是本地方法,也就是用 c 或 c++ 实现的,该方法直接返回对象的内存地址。
        详情: java Object的hashCode

3、toString():

1、默认返回:
                全类名(包名+类名) + @ + 哈希值的十六进制。
    源码:
    
2、子类往往会重写该方法,用来输出对象的属性信息。
3、重写该方法后,打印或拼接对象时,都会自动调用该对象的toString()方法。
4、直接输出一个对象时,toString()方法会被默认调用

4、finalize():

    当垃圾回收器确定不存在该对象的更多引用时,由垃圾回收器自动调用此方法。
1、当对象被回收时,系统自动调用该对象的finalize()方法。子类可以重写该方法,做一些释放资源的操作。
2、什么时候对象会被回收:
        当一个对象没有任何引用时,jvm就认为该对象是一个垃圾对象,就会使用垃圾回收机制销毁该对象,
      在销毁该对象前,会先调用finalize()方法。
3、若不重写该方法,则在销毁某个对象前,会自动调用object的finalize()方法,即什么也不做。
4、并不是一个对象没有引用之后立刻就会被回收:
        如果一个对象一旦没有引用,就立刻被回收,意味着垃圾回收器会时时刻刻监控,这样浪费资源,效率低。
      垃圾回收器有一个自己的算法,会根据算法来回收。
5、也可以通过System.gc()主动触发垃圾回收机制。
        System.gc():作用为立即运行垃圾回收器。
        且垃圾回收器调用过程中,不会阻塞程序,程序会继续向后运行。

5、clone():

实现clone()的两种方式:
    a.在java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化的方式来实现。
    b.如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。
        这时我们可以用序列化的方式来实现对象的深克隆。
object规范中clone的约定:(不是绝对的要求,只是一个实现clone方法时应该遵守的规范标准)
    x.clone() != x 返回 true;                即二者不是同一个对象,地址不同
    x.clone().getClass() == x.getClass() 返回 true;                即二者属于同一个类
    x.clone.equals(x) 返回 true,自定义对象应重写equals方法。            即二者通过equals()判断相同,也就是值相同
    按照约定, 克隆对象与原对象地址地址不同,所属 同一个类,两个对象 对应实例各字段的值相同,即克隆的对象不依赖于原对象,也就是 深拷贝
按照约定,clone返回的对象应该通过 super.clone() 获得。
默认使用父类clone()方法的缺陷:
    如果克隆对象中包含的域引用了可变的对象,上述这种简单的 clone 实现可能会导致灾难性的后果。
    因为默认clone()是浅克隆,如下图,school类中有两个属性:
        分别为String类型和Student[]类型
    
    使用clone克隆一份school1给school2
    
    可见,所有的引用数据类型,String类型的name中的value值,Student[]类型的数组
    的值都是一样的,也就是说指向同一个地方。
    
  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值