最近想要开始看jdk的源码,就先从Object类开始看吧。
Object类是类结构的根,Object类是所有类的父类,所有的对象,包括数组都实现了这个类的方法。
Object类的方法有哪些呢?
1.先来看一下源码中registerNatives()方法:
作用:对几个本地方法进行注册(也就是初始化java方法映射到C的方法)。
解释:从上面的代码中看到Object类定义了一个静态初始化块,我们知道当创建Java对象时,系统总是先调用静态初始化块
在上面的静态初始化块中调用了registerNatives()方法,并且使用了private来修饰,表面这个方法是私有的并不被外部调
用。在Java中使用native关键字修饰的方法,说明此方法并不是由Java中完成的,而是通过C/C++来完成的,并被编
译成.dll,之后才由Java调用。方法的具体实现是在dll文件中,当然对于不同平台实现的细节也有所不同,以上
registerNatives()方法主要作用就是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。
2.Object类中的getClass()方法:
作用:返回对应的当前正在运行时的类所对应的对象
示例:
package com.ftl810;
import java.util.Date;
class Test extends Date{
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
new Test().print();
}
public void print(){
System.out.println("当前运行类的名字为:"+super.getClass().getName());
System.out.println("当前运行类的名字为:"+this.getClass().getName());
System.out.println("当前运行类的继承的父类的名字为:"+this.getClass().getSuperclass().getName());
}
}
输出结果:
返回对应的当前正在运行时的类所对应的对象,那么super可以理解为Test的父类Date,那么请问当前Date类正在运行时的对象是谁?没错,就是其子类Test,所以this.getClass(0.getName()和super.getClass().getName()返回的是com.ftl810.Test
再看看getSuperClass():返回当前实体类的父类。所以要返回当前类的父类的话,请使用下面这中方式
super.getClass().getSuperClass().getName();
3.Object类中的hashCode()方法:
作用:返回该对象的哈希码值。支持此方法是为了提高哈希表的性能。
package com.ftl88;
public class Test {
public static void main(String[] args) {
String str="abc";
System.out.println(str.hashCode());
System.out.println(str.hashCode());
}
}
解释:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。
4.Object类中的equals()方法:
Indicates whether some other object is "equal to" this one.意思是指示是否有其他的某个对象和这个对象相等
Object
类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x
和 y
,当且仅当 x
和 y
引用同一个对象时,此方法才返回 true
(x == y
具有值 true
)。
此方法经常被重写,一般的当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
5.Object类中的clone()方法:
作用:创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。
对于任何对象x,表达式:
(1)x.clone() != x为true
(2)x.clone().getClass() == x.getClass()为true
(3)x.clone().equals(x)一般情况下为true,但这并不是必须要满足的要求
package com.ftl88;
public class Test implements Cloneable{
public static void main(String[] args) throws CloneNotSupportedException {
Test t=new Test();
System.out.println("t :"+t);
System.out.println("t.clone():"+t.clone());
System.out.println("t.getClass() :"+t.getClass());
System.out.println("t.clone().getClass():"+t.clone().getClass());
System.out.println(t.clone().equals(t));
Integer in=526345;
System.out.println(in.equals(in));
}
}
6.Object类中的toString()方法:
作用:toString
方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@
”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())
package com.ftl810;
import java.util.Date;
class Test extends Date{
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
Object ob=new Object();
System.out.println(ob.toString());
}
}