1.静态代码块里的registerNatives()方法,因为Object是所有java类的父类,且该方法在静态代码块里,所以只有创建任何对象都会调用这个方法,
答:该方法的作用是将java层的方法和本地方法名对应起来,方便调用本地函数
2.为什么Object是所有类的父类,java如何实现的呢
答:可以使用Object里定义好的一些方法,如果一个类没有显示指定父类,那么java在对该类进行编译的时候会加上extends Object
3.为什么要把clone方法的访问权限设置为protected,使用clone()需要注意什么
答:是为了保证clone不被滥用,用protected控制访问的权限,只能同包下来的类或者其子类才能调用。只有实现了Cloneable接口的类才能调用clone,否则将会抛出异常
4.如何使用clone()
答:有的时候我们希望获得一个对象一模一样的对象,并对其进行修改确不影响原有对象的值,此时就可以使用clone创建一个一模一样的新对象。但是需要注意的是,如果对象里面内嵌有别的对象,那么需要注意深copy和浅copy
5.为什么建议重写每个类的toString()方法
答:因为Object的toString()方法是会返回类名+@+hascode的16进制的值,不便于阅读
6.wait(),notfiy(),notifyAll()
答:首先上面三个方法都必须要求当前线程持有对象的monitor即持有锁,否则抛出异常;wait()会将释放当前线程的锁进入等待状态,实际上进入了一个_WaitSet队列,而notify()会从_WaitSet队列里随机拿一个线程(具体看jvm实现,有可能是取队列的第一个)放到_EntryList里,但并没有释放锁。处于_EntryList队列里的线程获得锁就可以运行,而_WaitSet里的线程必须等待被其他线程唤醒。notifyAll唤醒所有线程,即将所有线程从_WaitSet移出到_EntryList里,通常建议使用在while循环里使用wait notifyAll
7.finalize()
答:当一个对象被标记为不可达对象后,那么将会被第一次标记并且进行一次筛选,条件是是否有必要去执行finalize()方法,如果对象没有覆盖finalize()方法或者finalize()方法已经执行,那么都视为没有必要执行。如果被判定为有必要执行finalize()方法,那么这个方法将会放置在一个F-Queue的队列。稍后虚拟机会对这个队列进行第二次标记,所以在finalize()里可以挽救这个对象,比如把一个引用执行这个对象,但是finalize()只会被执行一次。