- 1.Object根父类代码结构
- 方法一:void registerNatives()
- 方法二:Class> getClass()
- 方法三:int hashCode()
- 方法四:boolean equals(Object obj)
- 2.全部源码注释解析
- 3.遇到的小问题
- 问题1:native关键字
- 问题2:jls(java language specification java语言规范
- 问题3:see注解
- 问题4:param注解
1、 registerNatives函数前面有native关键字修饰,Java中,用native关键字修饰的函数表明该方法的实现并不是在Java中去完成, 而是由C/C++去完成,并被编译成了.dll,由Java去调用。方法的具体实现体在dll文件中,对于不同平台,其具体实现应该有所不同。
2、 用native修饰,即表示操作系统需要提供此方法,Java本身需要使用。具体到registerNatives()方法本身, 其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。
**3、**从方法的代码中看到Object类定义了一个静态初始化块,我们知道当创建Java对象时,系统总是先调用静态初始化块
4、 在静态初始化块中调用了registerNatives()方法,并且使用了private来修饰,表面这个方法是私有的并不被外部调用。
*/
1、作用:返回Object对象的运行时对象的类
2、返回值为对象的类
例如:
package cn.Ivan.test;
import java.util.ArrayList;
public class ObjectTest {
public static void main(String[] args) {
Object obj1 = new Object();
System.out.println("obj1 的类: " + obj1.getClass());
String obj2 = new String();
System.out.println("obj2 的类: " + obj2.getClass());
ArrayList obj3 = new ArrayList<>();
System.out.println("obj3 的类: " + obj3.getClass());
}
}
运行结果为:
结果分析:obj1,obj2,obj3分别属于Object、String、ArrayList类的对象,所以getClass会返回各自的运行时对象的类名
1、作用:返回对象的哈希码值
2、返回值:对象的哈希值,int类型
例如:
package cn.Ivan.test;
public class ObjectTest {
public static void main(String[] args) {
Integer a = new Integer(10);
System.out.println("The hashCode of Integer class object a is :" + a .hashCode());
String str = new String("Hello, Welcome in java world");
System.out.println("The hashCode of String class object str is :" + str.hashCode());
}
}
运行结果:
public boolean equals(Object obj) {
return (this == obj);
}
1、作用:判断某个对象是否“等于”这个对象
2、返回值:布尔值true or false
3、性质:
a.自反性,对于非空引用值x,注意是非空,后面会说到null的情况 x.equals(x)会返回true 即:自身总是与自身“等于”。注意理解等于的实际意义,区别于现实中的等于 b.对称性: x.equals(y)为true,那么y.equals(x)也是true c.可传递的 x.equals(y)为true y.equals(z)为true 那么x.equals(z)也为true d.前后一致性:指的是在equals比较方法中使用的信息未被修改时,始终会返回相同的true or false结果 e.对于任何非空数值x,x.equals(null)应返回false f.非空数值x和y在引用同一个对象时,equals方法返回true g.当equals方法被覆写时,hashCode方法也会被覆盖,为了保证相等的对象具有相同的哈希值
例如:
public static void main(String[] args) {
// get an integer, which is an object
Integer x = new Integer(50);
// get a float, which is an object as well
Float y = new Float(50f);
// check if these are equal,which is
// false since they are different class
System.out.println("" + x.equals(y));
// check if x is equal with another int 50
System.out.println("" + x.equals(50));
}
运行结果:
package java.lang;
public class Object {
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();//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 { }
}
3.遇到的小问题
问题1:native关键字
private static native void registerNatives();
static {
registerNatives();
}
native即JNI,Java Native Interface(Java本地接口,用户和本地C代码进行互操作的API),也就是说一个native method就是一个java调用非java代码的接口,该方法由非java语言实现,例如C语言。
1、native是用作 java和其他语言进行协作时使用的,也就是native后的函数的实现不是用java编写的
2、既然都不是java,那就不管其源码如何,只需知道此方法已经被实现即可
3、native的意思是告诉操作系统,这个函数我要用,你必须给我实现,所以native关键字的函数时OS实现的,java平台只能调用
4、java是跨平台的语言,跨平台付出的代价就是牺牲一些对底层的控制。而java要实现对底层的控制就需要其他语言的帮助,这里的native就是帮助java实现对底层的控制。
* @jls 15.8.2 Class Literals
className.class在jls中定义为Class Literal,15.8.2位规范版本号
问题3:see注解注解@see可以在注释汇总实现链接跳转,可以指向包,类,方法,属性。
使用方法:@see package.class#member
1、指向的目标在当前类:#+
@see #field
@see #method(type,…)
@see #constructor(type,…)
2、指向的目标在当前包,类名+#+
@seeClass #field
@see Class#method(type,…)
@see Class#constructor(type,…)
@see Class
3、指向的目标在其他包中,需要全路径
@see package.Class#field
@see package.Class#method(Type, Type,…)
@see package.Class#method(Type argname, Type argname,…)
@see package.Class#constructor(Type, Type,…)
@see package.Class#constructor(Type argname, Type argname,…)
@see package.Class.NestedClass
@see package.Class
@see package
@param是MyBatis提供的,作为Dao层的注解,用于传递参数,从而与SQL中的字段名相对应
作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)



