object类介绍、方法、以及扩展

1.    Object类介绍

Object类是Java中其他所有类的祖先,没有ObjectJava面向对象无从谈起。

Object类是java中所有类的父类,每个类都使用 Object作为超类。所有对象(包数数组,String,Class , Method)都实现这个类的方法。具体的关系视图如下:

--class Animal { }

--class Cat extends Animal { }

--class Poss extends Cat { }

则实际的关系为:

Object  -----   Animal  -----   Cat  ----- Poss

大家可能会说,这样的继承继承关系有什么好处,但是实际上,这样的继承关系,很好的体现了java的思想。我们将所有类都公用的方法集成出来,让所有的类都具有Object类中的方法。

2.    Object类方法介绍

Object的文档中写了如下方法:

protected Object

clone()
创建并返回此对象的一个副本。

boolean

equals(Object obj)
指示其他某个对象是否与此对象“相等”。

protected void

finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

Class<?>

getClass()
返回此 Object 的运行时类。

int

hashCode()
返回该对象的哈希码值。

void

notify()
唤醒在此对象监视器上等待的单个线程。

void

notifyAll()
唤醒在此对象监视器上等待的所有线程。

String

toString()
返回该对象的字符串表示。

void

wait()
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

void

wait(long timeout)
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。

void

wait(long timeout, int nanos)
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。

大家看这个可能并不十分清楚,那么久让我为大家解释一下:

protected Object

clone()
创建并返回此对象的一个副本。该方法主要是对对象进行克隆,但是需要注意的是,如果该对象需要克隆,需要在对象类上实现接口Cloneable

boolean

equals(Object obj)
指示其他某个对象是否与此对象“相等”。如果继承类没有重写该方法,则比较的是对象的存储地址,如果重写需要注意,循序渐进,比较地址--- 比较hashCode --- 比较成员属性

protected void

finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

此方法和System.gc的效果相同,只是通知java虚拟机清理,但是只是起通知的作用

Class<?>

getClass()
返回此 Object 的运行时类。

运行时类,也就是实现类。在继承之前已经说过,Animal animal = new Cat();那么实现类就是Cat类。返回的需要注意,返回的是类对象,这个方法十分重要,在后期接触到的反射、动态代理、工厂模式和框架中,应用的十分频繁。  ****  重要

int

hashCode()
返回该对象的哈希码值。

每个对象都对应一个唯一的hashCode,根据不同的哈希散列算法算出来的数值。本质上是一个32位的二进制,根据哈希散列算法使不同对象均匀散列在哈希码的取值范围之内。人为认定哈希码值是唯一的。对象存储的时候,也是根据元素的哈希码来存储的。哈希码相同内存碰撞,原来的后挪一位,新产生的放在原处。

void

notify()
唤醒在此对象监视器上等待的单个线程。

这个方法以及下面的wait方法都是主要在线程的部分用到,多线程编程会考虑到线程安全问题,如果有需要,可以将需要的线程唤醒,其他线程设置为等待。notifyAll()是唤醒全部,wait是线程等待

void

notifyAll()
唤醒在此对象监视器上等待的所有线程。

String

toString()
返回该对象的字符串表示。

toString方法是一个很常用的方法,可以用来打桩输出对象信息,进行更有效的调试。

如果没有重写toString方法,输出的是对象的类名+地址,如果重写了,输出重写的内容。

void

wait()
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

void

wait(long timeout)
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。

void

wait(long timeout, int nanos)
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。

 

3.    Object类扩展

Object是一个非常重要的类,因为不仅提供了一套共有的方法,也为继承类书写了共有方法的规范。

需要注意的equals(Object obj)方法,在后续集合部分,用到set集合时,需要对自己书写的对象重写equals方法,同时也必须重写或实现hashCode方法。建议重新写步骤是:

比较地址---比较hashCode----比较成员属性。代码如下:

publicboolean equals(Object obj){

        //判断地址

        if(this == obj){

            returntrue;

        }

        //判断为空 null调用方法或者属性会空指针异常

        if(obj == null ){

            returnfalse;

        }

        //判断数据类型是否相等

        if(this.getClass()!= obj.getClass()){

            returnfalse;

        }

        //判断属性值是否一致

        Personb = (Person) obj;

        if(this.age != b.age){

            returnfalse;

        }

        //两个字符串对象的地址或者属性相同并且都不能为空

        if(this.name == b.name || b.name.equals(this.name) && this.name == null && b.name == null){

            returntrue;

        }

        returnfalse;

    }

 


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Xingxinxinxin/article/details/79959262
个人分类: java API
上一篇java-面向对象-静态、final、abstract和接口
下一篇socket套接字编程 ---- UDP/TCP编程Demo
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭