Object类源码笔记
类结构
类的结构图
1.Object的构造方法
- 只有一个构造方法,也就是默认的构造方法,public修饰的无参构造,可以创建Object类的对象
2.registerNatives()方法
-
源码
private static native void registerNatives(); static { registerNatives(); }
-
含义:本地注册的意思
-
作用:加载本地方法
-
分析:
- 该方法由static修饰,为静态方法,说明在类加载的时候便会加载
- 该方法由private修饰,说明该方法只能在类的内部调用,或通过
- 该方法由native修饰,native表示该方法的实现java本身并没有完成,而是有c/c++来完成,形成.dll文件。
- 静态代码块,在类加载初始化的时候执行registernatives方法
3.getClass()方法
-
源码
public final native Class<?> getClass();
-
作用:获取一个类的定义信息(也就是一个类的class对象),一般用于反射中,通过class对象去访问其全部信息
-
分析
- native修饰,本地方法
- public修饰,由于object为所有类的父类,所以任何对象都可调用getClass方法
- final修饰,不可被重写
4.hashCode()方法
-
源码
public native int hashCode();
-
分析
- public修饰,公共,适合任何对象
- native修饰且无{},没有实现,即调用本地c/c++实现
- 返回值int,由数据判断对象是否相同
- 没有使用final修饰,说明是可以被重写的
-
HashCode
- hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,也就是哈希码
- 哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。
- 在Java中,哈希码代表对象的特征。
-
HashCode拓展
-
Object类的hashCode返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
-
String类的hashCode根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同
-
Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,
//例如: Integer i1=new Integer(100); //i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
- 由此可以看出Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的 字段等)映射成一个数值,这个数值称作为散列值。
-
-
注意
- 一般新建对象的时候最好重写hashcode与equals方法
- 两个内容相同,内存地址不同的对象,调用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:返回值:表示可以返回任何值,所以需要强转
-
作用:快速克隆出另一个对象
-
使用
- 重写clone()方法
- 否则无法调用,因为object中clone方法中protected修饰的
- 实现CloneAble()接口
- 否则会抛出
CloneNotSupporteddException;
异常
- 否则会抛出
- 使用对象调用clone()方法
- 重写clone()方法
7.toString()方法
-
源码
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } //public:任何对象可以调用 //返回值String:返回一个由 getClass().getName() + "@" + Integer.toHexString(hashCode()); // 组成的一个字符串,实质为 包名(非全限定).类名@十六进制的hashCode值 //参数:无
-
使用
- 使用对象直接输出,都会调用toString方法,若对象本身的类没有,则会调用Object类中的toString方法
- 一般来说,一个对象都应该重写该方法
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。
-
作用
- 使线程主动释放对象锁,并进入等待状态,直到notigy()或者notifyAll()唤醒或超过指定时间指定的等待时间
- 在调用wait()方法前,线程获得该对象的对象锁
- 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()方法
- 对象调用此方法