Object类
Object类有12个成员方法
1,构造函数
2,clone()
3,hashCode和equale函数用来判断对象是否相同,
4,toString()和getClass,
5,wait(),wait(long),wait(long,int),notify(),notifyAll()
6,finalize()用于在垃圾回收
clone()
clone()函数的用途是用来另存一个当前存在的对象。
hashCode()和equale()
- equale()用于确认两个对象是否相同。
- hashCode()用于获取对象的哈希值,这个值的作用是检索
- 哈希值相同的对象不一定equale()
- equale()返回true的两个对象一定相同。
toString()和getClass()
toString()返回一个String对象,用来标识自己
getClass()返回一个Class对象,如果打印出来会发现结果是如下格式
class package.name.xxx
因为返回的是一个class对象,后面可以跟class类的方法。用的是谁的构造函数,那么getClass返回的就是谁的类型。 getClass()经常用于java反射机制
wait(),wait(long),wait(long,int),notify(),notifyAll()
- 这几个函数体现的是Java的多线程机制
- 在使用的时候要求在synchronize语句中使用
- wait()用于让当前线程失去操作权限,当前线程进入等待序列
- notify()用于随机通知一个持有对象的锁的线程获取操作权限
- notifyAll()用于通知所有持有对象的锁的线程获取操作权限
- wait(long) 和wait(long,int)用于设定下一次获取锁的距离当前释放锁的时间间隔
finalize()
这个函数在进行垃圾回收的时候会用到,匿名对象回收之前会调用到。
附上一段JVM中关于finalize方法的背景。
源码:
private static native void registerNatives();
static {
registerNatives();
}
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException( "nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
protected void finalize() throws Throwable { }
native关键字
native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。
声明native方法:如果你想将一个方法做为一个本地方法(在JVM本地方法栈中存)的话,那么你就必须声明改方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。
Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法hello()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
第一步编写java类,第二步编译生成.h文件,第三步用c语言实现具体代码
b.编译
javac HelloWorld.java
c.生成.h文件
javah -jni HelloWorld
生成内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
第一个参数是调用JNI方法时使用的JNI Environment指针。第二个参数是指向在此Java代码中实例化的Java对象HelloWorld的一个句柄。其他参数是方法本身的参数