从零开始的JDK之旅 day01
万物皆对象(类)
Object类是所有类的父类,所有类默认都继承Object类。
在看Object类源码的时候,会发现里面好多被native关键字修饰的方法。那么native这个关键字是什么意思呢?
被native关键字修饰的方法表示这个方法不是在java中实现的,而是由其他语言(c语言或c++或汇编)编写的,
并且被编译成.dll,可以由java直接去调用。
源码中第一个由native修饰的方法就是registerNatives()方法
private static native void registerNatives();
static {
registerNatives();
}
registerNatives()方法在静态代码块中被调用,这也就是说当类第一次被加载的时候就会调用这个方法,并且只会调用一次。
静态代码块:静态代码块在类进行初始化的时候被执行,并且只会被执行一次,由JVM保证只执行一次,如果一个类中有多个静态代码块,按静态代码块的代码顺序执行。
registerNatives()方法有什么用呢?
本地方法的实现是由其他语言编写并保存在动态连接库中,因此在java类中不需要实现。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);
}
}
如果要使用clone方法,那个这个类必须实现Cloneable接口才可以,否则会抛出java.lang.CloneNotSupportedException异常。
notify()方法:随机唤醒一个线程
notifyAll()方法:唤醒所有线程
wait(long timeout)方法:让线程进入等待状态,直到其他线程通过notify()方法或notifyAll()方法唤醒,该方法只能在同步方法中调用。
wait()方法:内部调用重载方法wait(0)。
wait(long timeout) 超过timeout时间会醒来,但如果timeout为0则不考虑实时,线程一直等待直到通知。
finalize()方法:finalize()方法只会被调用一次,用于GC在垃圾回收前判断对象要不要回收,再次执行GC的时候不会执行这个方法,只会执行一次。
非native方法
equals(Object obj)方法:比较两个对象是否相同。
两个对象之间比较 p1 == p2
比较的是p1 和 p2 的内存地址()
在字符串的equals(Object anObject)方法中:比较的是内容是否相同。
toString()方法:toSting()方法就是将当前对象装换成String字符串。
Object类中打印的是:
getClass().getName() + "@" + Integer.toHexString(hashCode())
因为Object是所有类的超类,所以任何类都可以按自己的要求重写equals(Object obj)方法 和 toString()方法。