1.Object根父类代码结构
方法一:void registerNatives()
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来修饰,表面这个方法是私有的并不被外部调用。 */
方法二:Class<?> getClass()
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<Integer> obj3 = new ArrayList<>();
System.out.println("obj3 的类: " + obj3.getClass());
}
}
运行结果为: 结果分析:obj1,obj2,obj3分别属于Object、String、ArrayList类的对象,所以getClass会返回各自的运行时对象的类名
方法三:int hashCode()
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());
}
}
运行结果:
方法四:boolean equals(Object obj)
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) {
Integer x = new Integer(50);
Float y = new Float(50f);
System.out.println("" + x.equals(y));
System.out.println("" + x.equals(50));
}
运行结果:
2.全部源码注释解析
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();
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实现对底层的控制。
问题2:jls(java language specification 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
问题4:param注解
@param是MyBatis提供的,作为Dao层的注解,用于传递参数,从而与SQL中的字段名相对应 作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)
|