当前位置: 首页 > 后端技术 > Node.js

你真的了解Object的源码吗

时间:2023-04-03 23:09:13 Node.js

欢迎点赞阅读,一起学习交流,有问题请留言。GitHub上还有一个开源的JavaHouse。欢迎star介绍Object。应该是比较简单的源码。下面我们来分析一下他。对象是类层次结构的根。Java系统中的每个类都有一个默认的超类,即Object。总之,所有的对象,包括数组,都默认实现了这个类的方法。native关键字是因为在Object类中很多地方都用到了native关键字。我们先来认识一下这个人。native关键字是JNI(JavaNativeInterface)的重要体现。什么是JNI,JNI是Java调用其他语言(c、c++)的一种机制。native关键字修饰方法,起到声明的作用,告诉JVM小弟自己调用这个方法。这个方法的实现已经有其他语言的实现,我们看不到源码。InitializeprivatestaticnativevoidregisterNatives();static{registerNatives();}源码中有一个static块,没有显示的静态方法和默认构造函数,没有成员变量。可以看出registerNatives()方法只会被调用一次。getClass()方法publicfinalnativeClassgetClass();getClass()方法是native修改的,告诉JVM自己调用。它也是最终修改的,所以它不能被子类覆盖。主要功能是返回运行类别(Class)。hashCode()方法publicnativeinthashCode();getClass()方法是native修改的,告诉JVM自己调用,可以重写。它也是最终修改的,所以它不能被子类覆盖。该方法主要返回对象的hashcode,主要针对一些哈希表的数据结构,比如HashMap。在Java中,hancode与对象相等性密切相关。如果两个对象相等,则hashcode一定相等,但如果hashcode相等,则两个对象不一定相等。如果哈希码不相等,则两个对象一定不相等。equals(Objectobj)publicbooleanequals(Objectobj){return(this==obj);}这个方法可以重写,主要用来判断两个对象是否相等。此方法有一些约定。Object任何非空对象x,x.equals(x)返回true。Object任意两个非空对象x,y,如果x.equals(y)返回true,那么y.equals(x)也会返回true,是对称的。Object任意三个非空对象x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)返回true,具有传递性。对象的任意两个非空对象x和y,当有变化时,x.equals(y)总是返回true或flase,这是一致的。Object任何非空对象x,x.equals(null)返回false。Object#equals(Objectobj)方法比较内存地址。通常在实际应用中,我们要比较的是两个对象中的属性内容是否相等,所以会重写这个方法。这里需要注意的是,重写equals(Objectobj)时,hashCode()方法也要重写。因为Java规定如果两个对象相等,那么它们的hashcode也应该相等。以Integer为例:@Overridepublicbooleanequals(Objectobj){if(objinstanceofInteger){returnvalue==((Integer)obj).intValue();}returnfalse;}@OverridepublicinthashCode(){returnInteger.hashCode(value);}publicstaticinthashCode(intvalue){returnvalue;}clone()protectednativeObjectclone()throwsCloneNotSupportedException;这个方法是native修改的,告诉JVM自己调用。当我们在自定义类中使用该方法时,需要继承一个Cloneable接口,否则会抛出无法克隆的异常。这个方法是浅拷贝,不是深拷贝。浅拷贝:基本数据类型按值传递,引用数据类型按引用复制。这是一个浅拷贝。深拷贝:传递基本数据类型的值,为引用数据类型创建一个新的对象,并复制其内容。这是一个深拷贝。使用代码@DatapublicclassPersonextendsManimplementsCloneable{privateStringname;私人Person人;publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{Personperson=newPerson();person.setName("陈");clone=(Person)person.clone();System.out.println(clone.toString());System.out.println("person.equals(clone):"+person.equals(clone));系统。out.println("person==clone:"+(person==clone));System.out.println("person.person==clone.person:"+(person.person==clone.person));}ResultPerson(name=chen,person=null)person.equals(clone):trueperson==clone:falseperson.person==clone.person:truenotify(),notifyAll()和wait()publicfinalnativevoidnotify();publicfinalnativevoidnotifyAll();publicfinalvoidwait()throwsInterruptedException{wait(0);}notify()随机唤醒一个等待线程,notifyAll()唤醒所有等待线程。wait()方法将当前线程置于等待状态。无论当前线程调用哪个方法,都有一个前提:当前线程拥有该对象的监视器。实现方法也很简单,配合synchronized关键字使用。实现方法synchronized(obj){while(true)obj.wait();//obj.notify();}举个实际例子多线程打印奇偶数publicstaticvoidmain(String[]args){Threadthread=newThread(()->{for(inti=0;i<100;i+=2){synchronized(a){System.out.println(Thread.currentThread().getName()+":"+i);try{a.wait();}catch(InterruptedExceptione){e.printStackTrace();}}}});线程thread1=newThread(()->{for(inti=1;i<100;i+=2){synchronized(a){System.out.println(Thread.currentThread().getName()+":"+i);a.notify();}try{Thread.sleep(200);}catch(InterruptedExceptione){e.printStackTrace();}}});thread.start();thread1.start();}finalize()protectedvoidfinalize()throwsThrowable{}当垃圾收集器确定不再有对该对象的引用时,该对象将只调用一次该方法。参考如果我的文章对你有帮助,可以关注我的微信公众号,第一时间分享文章给你