万物皆对象(类)
在看Object类源码的时候,会发现里面好多被native关键字修饰的方法。那么native这个关键字是什么意思呢?
被native关键字修饰的方法表示这个方法不是在java中实现的,而是由其他语言(c语言或c++或汇编)编写的,
并且被编译成.dll,可以由java直接去调用。
源码中第一个由native修饰的方法就是registerNatives()方法
private static native void registerNatives();
static {
registerNatives();
}
registerNatives()方法在静态代码块中被调用,这也就是说当类第一次被加载的时候就会调用这个方法,并且只会调用一次。
registerNatives()方法有什么用呢?
native方法
getClass()方法:获取当前类的Class类型对象,内存中的Class对象,通过这个对象可以获取当前类的的所有信息。这个方法等价于类名.class。相当于直接拿到.class文件。
Person p1 = new Person("abc",10);
Class clazz = p1.getClass();
clazz.getName();
System.out.println(Person.class == clazz); // true
hashCode()方法:返回当前类的hashCode()码。
clone()方法:
public class ObjectDemo implements Cloneable{
public static void main(String[] args) throws CloneNotSupportedException {
//3、 clone方法 protected 被保护的 访问权限是同一个包下或者其子类
ObjectDemo od = new ObjectDemo();
ObjectDemo clone = (ObjectDemo) od.clone();
System.out.println(od);
System.out.println(clone);
System.out.println(od == clone);
}
}
notify()方法:随机唤醒一个线程
notifyAll()方法:唤醒所有线程
wait(long timeout)方法:让线程进入等待状态,直到其他线程通过notify()方法或notifyAll()方法唤醒,该方法只能在同步方法中调用。
wait()方法:内部调用重载方法wait(0)。
finalize()方法:finalize()方法只会被调用一次,用于GC在垃圾回收前判断对象要不要回收,再次执行GC的时候不会执行这个方法,只会执行一次。
非native方法
equals(Object obj)方法:比较两个对象是否相同。
toString()方法:toSting()方法就是将当前对象装换成String字符串。
Object类中打印的是:
getClass().getName() + "@" + Integer.toHexString(hashCode())
因为Object是所有类的超类,所以任何类都可以按自己的要求重写equals(Object obj)方法 和 toString()方法。