来看一下Object这个根类的方法:
1.首先看到的是一个静态代码块调用 registerNatives这个本地方法。
这个方法是干嘛的呢? 查阅资料发现(https://stackoverflow.com/questions/1010645/what-does-the-registernatives-method-do)
通常,为了让JVM找到你的本地函数,它们必须以某种方式命名。例如,java.lang.Object.registerNatives对应的C函数被命名Java_java_lang_Object_registerNatives。通过使用registerNatives(或者说,JNI函数RegisterNatives),你可以任意指定你的C函数。
2.getClass方法
3.hashCode()方法
有几点要注意:
a.在java程序运行期间,若用于equal的方法的信息或者数据没有修改,name同一个对象多次调用此方法返回的哈希码是相同的。而在两次独立运行的java程序,对于同一对象,哈希码可以不同。
b.如果根据equal方法,两个对象相同,那他的哈希码一定相同
c.假如两个对象通过equal比较不相同,那这两个对象返回的哈希码也不是一定要相同。但是使用者应该知道对不同的对象产生不同的hashCode是可以提高hash tables的性能的。
d.实际使用中,要尽量保证不同的对象发挥的哈希码不同。hashCode的一个典型实现是将对象的内部地址转为整数,这种实现不是必须的。
4.equals()方法
5.clone()方法
clone方法是创建并且返回一个对象的复制之后的结果。复制的含义取决于对象的类定义。这个方法一般的意图是对于对象x,能够保证以下的表达式成立。
x.clone() != x; x.clone().getClass() == x.getClass(); x.clone().equals(x);
这些表达式一般都为true,但是并不是绝对需要的。
按照惯例,返回的对象应该通过调用super.clone()来取得。如果一个类以及它所有的超类都服从这个惯例,那么x.clone().getClass()==x.getClass()成立。
按照惯例,clone方法返回的对象是独立于调用clone方法的对象。为了获得这种独立性,在返回克隆对象之前,需要修改对象的成员变量。即如果我们要是复制可变的对象,内部的部分成员变量是由指定可变对象的引用组成,那么我们对这些成员变量也要进行clone复制,下面有例子说明。但是如果需要复制的类的成员变量是由基本类型或者由指向不可变对象的引用组成,那么我们不需要任何修改,直接对对象调用clone方法即可。
如果一个类没有实现Cloneable接口(这个接口里面没有任何方法的声明,是一个标记接口),那么对此类的对象进行复制时,在运行时会出现CloneNotSupportedException异常。
这里有两个概念需要知道:
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
其实浅拷贝和深拷贝只是相对的,如果一个对象内部只有基本数据类型,那用 clone() 方法获取到的就是这个对象的深拷贝,而如果其内部还有引用数据类型,那用 clone() 方法就是一次浅拷贝的操作。
实现对象拷贝的另一个方法是 :序列化(serialization)这个对象,再反序列化回来,就可以得到这个新的对象,无非就是序列化的规则需要我们自己来写。
6.toString()方法
7.notify()方法
8.notifyAll()方法
9.wait方法