Object类源码笔记

Object类源码笔记

类结构

类的结构图

在这里插入图片描述

1.Object的构造方法

  • 只有一个构造方法,也就是默认的构造方法,public修饰的无参构造,可以创建Object类的对象

2.registerNatives()方法

  • 源码

    private static native void registerNatives();
    static {
         registerNatives();
    }
    
  • 含义:本地注册的意思

  • 作用:加载本地方法

  • 分析:

    1. 该方法由static修饰,为静态方法,说明在类加载的时候便会加载
    2. 该方法由private修饰,说明该方法只能在类的内部调用,或通过
    3. 该方法由native修饰,native表示该方法的实现java本身并没有完成,而是有c/c++来完成,形成.dll文件。
    4. 静态代码块,在类加载初始化的时候执行registernatives方法

3.getClass()方法

  • 源码

    public final native Class<?> getClass();
    
  • 作用:获取一个类的定义信息(也就是一个类的class对象),一般用于反射中,通过class对象去访问其全部信息

  • 分析

    1. native修饰,本地方法
    2. public修饰,由于object为所有类的父类,所以任何对象都可调用getClass方法
    3. final修饰,不可被重写

4.hashCode()方法

  • 源码

    public native int hashCode();
    
  • 分析

    • public修饰,公共,适合任何对象
    • native修饰且无{},没有实现,即调用本地c/c++实现
    • 返回值int,由数据判断对象是否相同
    • 没有使用final修饰,说明是可以被重写的
  • HashCode

    • hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,也就是哈希码
    • 哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。
    • 在Java中,哈希码代表对象的特征。
  • HashCode拓展

    1. Object类的hashCode返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。

    2. String类的hashCode根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同

    3. Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,

      //例如: 
      Integer  i1=new Integer(100)//i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。  
      
      • 由此可以看出Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的 字段等)映射成一个数值,这个数值称作为散列值。
  • 注意

    1. 一般新建对象的时候最好重写hashcode与equals方法
    2. 两个内容相同,内存地址不同的对象,调用object类中的hashCode方法,返回的hashCode不相同

5.equals(odject obj)方法

  • 源码

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

    • 判断两个对象是否相同
  • 分析

    • public修饰,因为object是所有类的父类,说明,任何对象都会有equals()方法

    • 返回值为boolean

    • 形参是Object类型,说明可以为使用任何对象

    • 代码块

      • retur (this==obj)

      • 这里this代码调用该方法的对象,obj表示需要判断的对象

      • 这里它们使用的==来进行比较,比较的是两个对象的地址值

  • 注意

    • 一般来说,在使用的时候,都会进行重写
    • 一般来说,在重写equals的时候,都会重写hashCode方法
    • 在eclipse或idea中提供有重写的快捷方式
  • 如何重写equals方法

    @Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + id;
    		result = prime * result + ((name == null) ? 0 : name.hashCode());
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		User other = (User) obj;
    		if (id != other.id)
    			return false;
    		if (name == null) {
    			if (other.name != null)
    				return false;
    		} else if (!name.equals(other.name))
    			return false;
    		return true;
    	}
    

6.clone()方法

  • 源码

    protected native Object clone() throws CloneNotSupportedException;
    
    /*
    protected:表示可以在同类中,或者子类的方法中使用,因为object是所有类的父类,
    所以对象如果要使用clone()方法的话,只能重写后才可以使用,例如下,eclipse中有
    @Override
    	protected Object clone() throws CloneNotSupportedException {
    		return super.clone();
    	}
    */
    //native:表示java调用非java代码的接口,是一个其他语言实现的方法。
    //Object:返回值:表示可以返回任何值,所以需要强转
    
  • 作用:快速克隆出另一个对象

  • 使用

    1. 重写clone()方法
      • 否则无法调用,因为object中clone方法中protected修饰的
    2. 实现CloneAble()接口
      • 否则会抛出CloneNotSupporteddException;异常
    3. 使用对象调用clone()方法

7.toString()方法

  • 源码

    public String toString() {
       return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    
    //public:任何对象可以调用
    //返回值String:返回一个由 getClass().getName() + "@" + Integer.toHexString(hashCode());
    //            组成的一个字符串,实质为  包名(非全限定).类名@十六进制的hashCode值
    //参数:无
    
  • 使用

    1. 使用对象直接输出,都会调用toString方法,若对象本身的类没有,则会调用Object类中的toString方法
    2. 一般来说,一个对象都应该重写该方法

8.notify()方法

  • 源码

    public final native void notify();
    
    //public:任何对象可调用
    //final:不可被重写
    //native:调用的是本地实现
    //void:无返回值
    
  • 作用

    • 随机选择一个使用了wait()方法的线程,赋予其对象锁,并解除其阻塞状态

9.notifyAll()方法

  • 源码

    public final native void notifyAll();
    //public:任何对象可调用
    //final:不可被重写
    //native:调用的是本地实现
    //void:无返回值
    
  • 作用

    • 唤醒在该对象上调用wait()方法等待的所有线程

10.wait(long timeout)方法

  • 源码

    public final native void wait(long timeout) throws InterruptedException;
    
    //public:任何对象可调用
    //final:不可被重写
    //native:调用的是本地实现
    //void:无返回值
    //参数 long timeout :输入一个long类型的超时时间,毫秒,等待的时间,可选,不填则默认为0。
    
  • 作用

    1. 使线程主动释放对象锁,并进入等待状态,直到notigy()或者notifyAll()唤醒或超过指定时间指定的等待时间
    2. 在调用wait()方法前,线程获得该对象的对象锁
    3. wait方法执行前,该对象立即释放持有的对象锁

11.wait(long timeout,int nanos)

  • 源码

    public final void wait(long timeout, int nanos) throws InterruptedException {
      if(timeout < 0) {
        throw new IllegalArgumentException("timeout value is negative");
      }
      if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException("nanosecond timeout value out of range");
      }
      if (nanos > 0) {
          timeout++;
      }
      wait(timeout);
    }
    //timeout -- 最大等待时间(毫秒)。
    //nanos -- 附加时间在毫微秒范围0-999999。
    
  • 作用

    • 进入等待,经过timeout 超时后,若未被唤醒,则自动唤醒。相对wait(long timeout) 更加精确时间。

12.wait()方法

  • 源码

    public final void wait() throws InterruptedException {
      wait(0);
    }
    
  • 作用

    • 直接使该线程进行等待状态

13.finalized()方法

  • 源码

    protected void finalize() throws Throwable { }
    
  • 作用

    • 在gc回收对象之前执行一些清除操作,比如说一些IO流对象和外部的连接尚未关闭,这个时候如果gc对这个对象进行回收,那么finalize可以保证这个对象被回收之前其与外部的一些连接正常关闭。
  • 使用时机

    • 当jvm内存中的对象已经没有引用指向它的时候,此时GC垃圾回收器会自动调用该对象的finalized()方法
    • 在GC垃圾回收器,调用某个对象的finalized()方法后,jvm会再一次执行检查该对象是否还存在其他引用
  • 使用方法

    • 类重写finalized()方法
    • 对象调用此方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值