当前位置: 首页 > 后端技术 > Java

了解Java中基本的Object类

时间:2023-04-02 01:02:17 Java

一、Object简述源码注释:Object类是所有类层次结构的根节点,作为所有类的超类,包括数组也实现了这个类的方法,注意这里说的很明显是指班级水平。所以在Java中有一句俗语,万物皆对象,这也不算离谱。1、显式扩展结论验证由于Object是所有类的父级类,所以不需要显式添加继承关系,each01会在编译时提示去除冗余。publicclassEach01extendsObject{publicstaticvoidmain(String[]args){System.out.println(newEach01().hashCode()+";"+newObjEa02().hashCode());}}classObjEa02{}classObjEa03extendsObjEa02{}这里Each01和ObjEa02的每个对象实例都有Object类中的hashCode方法,这里是对已有结论的验证。编译文件再从JVM编译层面看字节码文件,如何加载,使用javap-c命令查看编译文件,注意Jdk版本1.8;javap-cEach01.class编译自“Each01.java”公共类com。base.object.each.Each01{公共com.base.object.each.Each01();Code:0:aload_01:invokespecial#1//Methodjava/lang/Object."":()V4:return}javap-cObjEa02.class从“Each01.java”类com.base编译而来。object.each.ObjEa02{com.base.object.each.ObjEa02();Code:0:aload_01:invokespecial#1//Methodjava/lang/Object."":()V4:return}javap-cObjEa03.class编译自"Each01.java"类com.base。object.each.ObjEa03extendscom.base.object.each.ObjEa02{com.base.object.each.ObjEa03();Code:0:aload_01:invokespecial#1//Methodcom/base/object/each/ObjEa02."":()V4:return}invokespecialcommand:可以查看Jvm官方文档中的指令说明、调用实例化方法、调用父类的初始化方法等。这里通过三个类的层级关系,对象超类不需要显式继承,即使显式声明,编译后源代码仍会清除冗余引用对象;通过new关键字创建对象,并根据默认构造函数进行初始化;将对象引用对象指向创建的对象。这个可以从Jvm的运行过程来理解,所以当一个对象失去了所有的引用,它就会被标记为垃圾对象,在垃圾回收器运行的时候进行清理。接受对任何数据类型对象的引用由于Object是Java中所有对象的超类,根据继承关系和向上转换机制的特点,Object可以接受对任何数据类型对象的引用。Object可以用来判断对象类型:publicclassEach02{publicstaticvoidmain(String[]args){//向上转型Objectobj01=newEach02Obj01("java");System.out.println(obj01);//向下转换Each02Obj01each02Obj01=(Each02Obj01)obj01;System.out.println("name="+each02Obj01.getName());}}classEach02Obj01{私有字符串名称;publicEach02Obj01(Stringname){this.name=name;}@OverridepublicStringtoString(){return"Each02Obj01{"+"name='"+name+'}';}publicStringgetName(){返回名称;}}这里要强调一下这个向上转化的过程:Objectobj01=newEach02Obj01("java");根据上面的流程分析,这里创建了一个父类引用obj01,它指向子类Each02Obj01对象,所以当输出,调用子类的toString方法。二、基本方法1、getClass在程序运行时获取对象的实例类,进而可以获取详细的结构信息并进行操作:publicfinalnativeClassgetClass();这个方法用在泛型,反射,动态代理等机制中有很多场景应用。2、toString返回对象的字符串描述形式。对象提供类名和无符号十六进制哈希值的组合。为了返回一个信息清晰的字符串,子类通常会重写这个方法:publicStringtoString(){returngetClass().getName()+"@"+Integer.toHexString(hashCode());}一个对象,将执行String.valueOf将其转换为字符串。底层还是对象的toString方法:publicvoidprintln(Objectx){Strings=String.valueOf(x);}publicstaticStringvalueOf(Objectobj){return(obj==null)?“空”:对象。toString();}3.equals和hashCodeequals:判断两个对象是否相等;hashCode:返回对象的哈希码值;publicnativeinthashCode();publicbooleanequals(Objectobj){return(this==obj);}equals判断方式需要考虑实际场景和策略。比如普通公民注册后分配的身份ID是不能修改的,但是名字是可以修改的,所以可能会有这样的场景:EachUsereachUser01=newEachUser(1,"A");EachUsereachUser02=newEachUser(1,"B");classEachUser{privateIntegercardId;privateStringname;}从程序本身来看,这确实是在创建两个对象,但是在场景中,这确实描述的是同一个人,所以这时候,可以在equals方法中定义比较规则,如果ID相同,则认为它们是同一个对象:@Overridepublicbooleanequals(Objectobj){if(obj!=null){EachUsercompareObj=(EachUser)obj;返回this.cardId.intValue()==compareObj.cardId;}returnBoolean.FALSE;}这里还要注意值类型和引用类型的区别,如果有空比较,则返回false通常,这两个方法在子类中是同时被重写的,在收集容器的设计。4、线程相关等待:线程进入等待状态,不会竞争锁对象notify:随机通知一个等待对象的线程;notifyAll:唤醒对象上所有等待的线程;publicfinalnativevoidwait(longtimeout)throwsInterruptedException;publicfinalnativevoidnotify();publicfinalnativevoidnotifyAll();这里注意:native关键字修饰的方法是调用native函数,也就是常说的基于C/C++的方法。方法,从而提高与系统层面交互的效率,降低交互的复杂度。5.clone返回当前对象的副本:protectednativeObjectclone()throwsCloneNotSupportedException;该方法的详细规则极其复杂,需要注意以下几个核心点:对象必须实现Cloneable接口才能被克隆;数据类型:值类型、字符串类型、引用类型;深拷贝和浅拷贝的区别以及相应的实现过程;在复杂的包装类型中,不同的变量类型组合在一起;6.finalize当垃圾回收器确认对象上没有引用时,会调用finalize方法,即清理内存和释放资源:protectedvoidfinalize()throwsThrowable{}通常子类不会重写这个方法,除非子类中有一些其他必要的资源清理动作。三、生命周期1、执行完下面的main方法后,就不能再访问Each05Obj01的实例对象了,因为对象引用each05丢失了:publicclassEach05{publicstaticvoidmain(String[]args){Each05Obj01each05=newEach05Obj01(99);System.out.println(each05);}}这里会有一个问题,引用丢失导致对象无法访问,但是此时对象可能还存在,内存占用没有释放。2、垃圾回收机制Java通过new创建的对象,会在堆中开辟内存空间进行存储。当对象失去所有引用时,它会被标记为垃圾对象,然后被回收;这里有以下几个关键点:Jvm中的垃圾收集器,它会监控创建的对象;当判断没有对象的引用时,会执行清理动作;对象清理完成后,会重新整理内存空间;这里有一个概念比较难理解,就是判断对象没有引用,也就是常说的可达性分析算法:根据对象到根对象的引用链是否可达来判断判断对象是否可以回收;GC-Roots根引用集合也可以理解为变相存活对象的集合。(详见JVM系列)通过对Object对象的分析,结合Java各方面的机制和设计,可以理解一些所谓的编程思想。4.源码地址GitEE地址https://gitee.com/cicadasmile/java-base-parentWiki地址https://gitee.com/cicadasmile/butte-java-note