java中对象创建、初始化、引用
发布时间:2020-12-14 06:37:33 所属栏目:Java 来源:网络整理
导读:p style="border:0px;list-style:none;line-height:21px;color:rgb(50,62,50);font-family:'Microsoft YaHei','Helvetica Neue',SimSun;font-size:14px;" span style="line-height:32px;color:rgb(255,102,0);font-size:16pt;"Java span style="line-height:
<p style="border:0px;list-style:none;line-height:21px;color:rgb(50,62,50);font-family:'Microsoft YaHei','Helvetica Neue',SimSun;font-size:14px;"> <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">如下表达式: <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;">A a1 = new A(); <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">它代表<span style="line-height:21px;">A<span style="line-height:21px;font-family:'宋体';">是类,<span style="line-height:21px;">a1<span style="line-height:21px;font-family:'宋体';">是引用,<span style="line-height:21px;">a1<span style="line-height:21px;font-family:'宋体';">不是对象,<span style="line-height:21px;">new A()<span style="line-height:21px;font-family:'宋体';">才是对象,<span style="line-height:21px;">a1<span style="line-height:21px;font-family:'宋体';">引用指向<span style="line-height:21px;">new A()<span style="line-height:21px;font-family:'宋体';">这个对象。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">在<span style="line-height:21px;">JAVA<span style="line-height:21px;font-family:'宋体';">里,“<span style="line-height:21px;">=<span style="line-height:21px;font-family:'宋体';">”不能被看成是一个赋值语句,它不是在把一个对象赋给另外一个对象,它的执行过程实质上是将右边对象的地址传给了左边的引用,使得左边的引用指向了右边的对象。<span style="line-height:21px;">JAVA<span style="line-height:21px;font-family:'宋体';">表面上看起来没有指针,但它的引用其实质就是一个指针,引用里面存放的并不是对象,而是该对象的地址,使得该引用指向了对象。在<span style="line-height:21px;">JAVA<span style="line-height:21px;font-family:'宋体';">里,“<span style="line-height:21px;">=<span style="line-height:21px;font-family:'宋体';">”语句不应该被翻译成赋值语句,因为它所执行的确实不是一个赋值的过程,而是一个传地址的过程,被译成赋值语句会造成很多误解,译得不准确。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">再如: <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;">A a2; <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">它代表<span style="line-height:21px;">A<span style="line-height:21px;font-family:'宋体';">是类,<span style="line-height:21px;">a2<span style="line-height:21px;font-family:'宋体';">是引用,<span style="line-height:21px;">a2<span style="line-height:21px;font-family:'宋体';">不是对象,<span style="line-height:21px;">a2<span style="line-height:21px;font-family:'宋体';">所指向的对象为空<span style="line-height:21px;">null; <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;">a2 = a1; <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">它代表,<span style="line-height:21px;">a2<span style="line-height:21px;font-family:'宋体';">是引用,<span style="line-height:21px;">a1<span style="line-height:21px;font-family:'宋体';">也是引用,<span style="line-height:21px;">a1<span style="line-height:21px;font-family:'宋体';">所指向的对象的地址传给了<span style="line-height:21px;">a2(<span style="line-height:21px;font-family:'宋体';">传址),使得<span style="line-height:21px;">a2<span style="line-height:21px;font-family:'宋体';">和<span style="line-height:21px;">a1<span style="line-height:21px;font-family:'宋体';">指向了同一对象。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">综上所述,可以简单的记为,在初始化时,“<span style="line-height:21px;">=<span style="line-height:21px;font-family:'宋体';">”语句左边的是引用,右边<span style="line-height:21px;">new<span style="line-height:21px;font-family:'宋体';">出来的是对象。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">在后面的左右都是引用的“<span style="line-height:21px;">=<span style="line-height:21px;font-family:'宋体';">”语句时,左右的引用同时指向了右边引用所指向的对象。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:28px;color:rgb(255,0);font-size:14pt;">JAVA<span style="line-height:28px;font-family:'宋体';color:rgb(255,0);font-size:14pt;">中对象创建和初始化过程 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">分析一下<span style="line-height:21px;">JAVA<span style="line-height:21px;font-family:'宋体';">中对象创建和初始化过程中涉及的相关概念问题,<span style="line-height:21px;">java<span style="line-height:21px;font-family:'宋体';">中栈<span style="line-height:21px;">(stack)<span style="line-height:21px;font-family:'宋体';">与堆<span style="line-height:21px;">(heap)<span style="line-height:21px;font-family:'宋体';">,对象、引用、句柄的概念。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">1.Java<span style="line-height:21px;font-family:'宋体';">中的数据类型 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">Java<span style="line-height:21px;font-family:'宋体';">中有<span style="line-height:21px;">3<span style="line-height:21px;font-family:'宋体';">个数据类型:基本数据类型<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">在<span style="line-height:21px;">Java<span style="line-height:21px;font-family:'宋体';">中,<span style="line-height:21px;">boolean<span style="line-height:21px;font-family:'宋体';">、<span style="line-height:21px;">byte<span style="line-height:21px;font-family:'宋体';">、<span style="line-height:21px;">short<span style="line-height:21px;font-family:'宋体';">、<span style="line-height:21px;">int<span style="line-height:21px;font-family:'宋体';">、<span style="line-height:21px;">long<span style="line-height:21px;font-family:'宋体';">、<span style="line-height:21px;">char<span style="line-height:21px;font-family:'宋体';">、<span style="line-height:21px;">float<span style="line-height:21px;font-family:'宋体';">、<span style="line-height:21px;">double<span style="line-height:21px;font-family:'宋体';">这八种是基本数据类型<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">、引用类型和<span style="line-height:21px;">null<span style="line-height:21px;font-family:'宋体';">类型。其中,引用类型包括类类型<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">含数组<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">、接口类型。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 下列语句声明了一些变量: <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';">以下是引用片段: <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">int k ; <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">A a; //a<span style="line-height:21px;font-family:'宋体';">是<span style="line-height:21px;">A<span style="line-height:21px;font-family:'宋体';">数据类型的对象变量名。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">B b1,b2,<span style="line-height:21px;font-family:'宋体';">…<span style="line-height:21px;">,b10000;//?<span style="line-height:21px;font-family:'宋体';">假定<span style="line-height:21px;">B<span style="line-height:21px;font-family:'宋体';">是抽象类或接口。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">String s; <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 注意:从数据类型与变量的角度看,基本数据类型变量<span style="line-height:21px;">k<span style="line-height:21px;font-family:'宋体';">、类类型变量<span style="line-height:21px;">a<span style="line-height:21px;font-family:'宋体';">和<span style="line-height:21px;">s<span style="line-height:21px;font-family:'宋体';">、抽象类或接口类型变量<span style="line-height:21px;">b(1<span style="line-height:21px;font-family:'宋体';">万个<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">,它们都是变量<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">标识符<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">2.<span style="line-height:21px;font-family:'宋体';">关于句柄<span style="line-height:21px;">(handle) <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 为了区别引用类型的变量标识符和基本数据类型变量标识符,我们特别的使用<span style="line-height:21px;">Handle<span style="line-height:21px;font-family:'宋体';">来称呼引用类型的变量标识符。上面例子中<span style="line-height:21px;">b1<span style="line-height:21px;font-family:'宋体';">至<span style="line-height:21px;">b10000<span style="line-height:21px;font-family:'宋体';">、<span style="line-height:21px;">a<span style="line-height:21px;font-family:'宋体';">、<span style="line-height:21px;">s<span style="line-height:21px;font-family:'宋体';">都是<span style="line-height:21px;">Handle<span style="line-height:21px;font-family:'宋体';">。<span style="line-height:21px;">Handle<span style="line-height:21px;font-family:'宋体';">直观的看就是手柄、把手,我们采用计算机界常用的中文翻译“句柄”。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">2.1<span style="line-height:21px;font-family:'宋体';">【<span style="line-height:21px;">Windows<span style="line-height:21px;font-family:'宋体';">编程中的】句柄的含义 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 句柄是<span style="line-height:21px;">WONDOWS<span style="line-height:21px;font-family:'宋体';">用来标识被应用程序所建立或使用的对象的唯一整数,<span style="line-height:21px;">WINDOWS<span style="line-height:21px;font-family:'宋体';">使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,<span style="line-height:21px;">GDI<span style="line-height:21px;font-family:'宋体';">对象等等。<span style="line-height:21px;">WINDOWS<span style="line-height:21px;font-family:'宋体';">句柄有点象<span style="line-height:21px;">C<span style="line-height:21px;font-family:'宋体';">语言中的文件句柄。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个<span style="line-height:21px;">16<span style="line-height:21px;font-family:'宋体';">位的无符号整数。应用程序几乎总是通过调用一个<span style="line-height:21px;">WINDOWS<span style="line-height:21px;font-family:'宋体';">函数来获得一个句柄,之后其他的<span style="line-height:21px;">WINDOWS<span style="line-height:21px;font-family:'宋体';">函数就可以使用该句柄,以引用相应的对象。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是驻留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,<span style="line-height:21px;">Windows<span style="line-height:21px;font-family:'宋体';">是一个以虚拟内存为基础的操作系统。在这种系统环境下,<span style="line-height:21px;">Windows<span style="line-height:21px;font-family:'宋体';">内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢<span style="line-height:21px;">? <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 为了解决这个问题,<span style="line-height:21px;">Windows<span style="line-height:21px;font-family:'宋体';">操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">存储单元的位置<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">本身是不变的。<span style="line-height:21px;">Windows<span style="line-height:21px;font-family:'宋体';">内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载<span style="line-height:21px;">(Load)<span style="line-height:21px;font-family:'宋体';">时由系统分配给的,当系统卸载时<span style="line-height:21px;">(Unload)<span style="line-height:21px;font-family:'宋体';">又释放给系统。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 句柄地址<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">稳定<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">→记载着对象在内存中的地址────→对象在内存中的地址<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">不稳定<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">→实际对象 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">2.2Java<span style="line-height:21px;font-family:'宋体';">中句柄的意义 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 对句柄以前的【<span style="line-height:21px;">Windows<span style="line-height:21px;font-family:'宋体';">编程中的】含义有了深刻的认识,我们可以说<span style="line-height:21px;">Handle<span style="line-height:21px;font-family:'宋体';">是一个我们学习<span style="line-height:21px;">Java<span style="line-height:21px;font-family:'宋体';">时非常需要的术语。它的意义在于区别“对象本身”和对象变量<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">或者严格点:对象所属的数据类型的变量标识符<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">2.3<span style="line-height:21px;font-family:'宋体';">回到<span style="line-height:21px;">1<span style="line-height:21px;font-family:'宋体';">中的变量声明: <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 现在,你应该对下面的注释一目了然。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">int k,j ;//k<span style="line-height:21px;font-family:'宋体';">里面存放的是一个整型数。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">A a; //a<span style="line-height:21px;font-family:'宋体';">里面存放地址。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,b10000;// b1<span style="line-height:21px;font-family:'宋体';">,…,<span style="line-height:21px;">b10000<span style="line-height:21px;font-family:'宋体';">里面存放地址。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">String s; //s<span style="line-height:21px;font-family:'宋体';">里面存放地址。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">3.<span style="line-height:21px;font-family:'宋体';">关于引用<span style="line-height:21px;">(reference) <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 什么是“引用”<span style="line-height:21px;">??<span style="line-height:21px;font-family:'宋体';">“<span style="line-height:21px;">the identifier you manipulate is actually a?<span style="line-height:21px;font-family:'宋体';">‘<span style="line-height:21px;">reference<span style="line-height:21px;font-family:'宋体';">’?<span style="line-height:21px;">to an object<span style="line-height:21px;font-family:'宋体';">”。<span style="line-height:21px;">(Thinking in Java 2e ) <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 翻译是:你操纵的标识符实际上是一个对象的“引用”。或者精确些,翻译成:你操作的标识符实际上是指向一个对象的“引用”。显然,原文中<span style="line-height:21px;">reference<span style="line-height:21px;font-family:'宋体';">是一个有方向感的东西。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 回到<span style="line-height:21px;">Java<span style="line-height:21px;font-family:'宋体';">中来,引用可以想象成对象的身份证号码、对象的<span style="line-height:21px;">ID<span style="line-height:21px;font-family:'宋体';">或者对象的手机号码。当然,更多的说法是,引用是对象在内存中住的房间号码。直观的说,对象的引用是创建对象时的返回值<span style="line-height:21px;">!<span style="line-height:21px;font-family:'宋体';">引用是<span style="line-height:21px;">new<span style="line-height:21px;font-family:'宋体';">表达式的返回值。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">new A();?<span style="line-height:21px;font-family:'宋体';">这里真正创建了一个对象,但我们没有用句柄去持有<span style="line-height:21px;">(hold<span style="line-height:21px;font-family:'宋体';">、拿着、保存<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">该引用。从微观上看,<span style="line-height:21px;">new<span style="line-height:21px;font-family:'宋体';">表达式完成了对象初始化的任务<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">三步曲,下文详细分析<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">,整体上看则返回一个引用。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 再次回到<span style="line-height:21px;">1<span style="line-height:21px;font-family:'宋体';">中的变量声明,再看看下面的注释。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">A a; //<span style="line-height:21px;font-family:'宋体';">声明句柄<span style="line-height:21px;">a<span style="line-height:21px;font-family:'宋体';">,但未初始化,所以里面的值为<span style="line-height:21px;">null<span style="line-height:21px;font-family:'宋体';">。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,b10000;//?<span style="line-height:21px;font-family:'宋体';">声明句柄<span style="line-height:21px;">b1<span style="line-height:21px;font-family:'宋体';">,…,<span style="line-height:21px;">b10000<span style="line-height:21px;font-family:'宋体';">,但未初始化,所以里面的值为<span style="line-height:21px;">null<span style="line-height:21px;font-family:'宋体';">。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">String s; //<span style="line-height:21px;font-family:'宋体';">声明句柄<span style="line-height:21px;">s<span style="line-height:21px;font-family:'宋体';">,但未初始化,所以里面的值为<span style="line-height:21px;">null<span style="line-height:21px;font-family:'宋体';">。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">4.<span style="line-height:21px;font-family:'宋体';">句柄与引用的关系 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">A a;//<span style="line-height:21px;font-family:'宋体';">声明句柄<span style="line-height:21px;">a<span style="line-height:21px;font-family:'宋体';">,值为<span style="line-height:21px;">null <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">a=new A();//<span style="line-height:21px;font-family:'宋体';">句柄的初始化<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">句柄?<span style="line-height:21px;">=?<span style="line-height:21px;font-family:'宋体';">引用<span style="line-height:21px;">;<span style="line-height:21px;font-family:'宋体';">即把引用赋值给句柄<span style="line-height:21px;">) <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 引用:<span style="line-height:21px;">new A()<span style="line-height:21px;font-family:'宋体';">的值。引用可以简单的看作对象占据内存空间的地址<span style="line-height:21px;">;<span style="line-height:21px;font-family:'宋体';">通过对象的引用,就可以方便的与其他对象区别开来,引用就是对象独特的身份标识。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 完成句柄的初始化后,就可以用句柄遥控对象了。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 当然,这只是从一方面解释对象的创建和初始化,理解了句柄和引用的关系后,下面分析对象初始化的整个过程。先做以下准备工作,说说栈与堆。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">5.java<span style="line-height:21px;font-family:'宋体';">中栈<span style="line-height:21px;">(stack)<span style="line-height:21px;font-family:'宋体';">与堆<span style="line-height:21px;">(heap) <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 在<span style="line-height:21px;">java<span style="line-height:21px;font-family:'宋体';">中内存分为“栈”和“堆”这两种<span style="line-height:21px;">(Stack and Heap).<span style="line-height:21px;font-family:'宋体';">基本数据类型存储在“栈”中,对象引用类型实际存储在“堆”中,在栈中只是保留了引用内存的地址值。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 顺便说说“<span style="line-height:21px;">==<span style="line-height:21px;font-family:'宋体';">”与“<span style="line-height:21px;">equals()<span style="line-height:21px;font-family:'宋体';">方法”,以帮助理解两者<span style="line-height:21px;">(Stack and Heap)<span style="line-height:21px;font-family:'宋体';">的概念。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 在<span style="line-height:21px;">Java<span style="line-height:21px;font-family:'宋体';">中利用<span style="line-height:21px;">"=="<span style="line-height:21px;font-family:'宋体';">比较变量时候,系统使用变量在<span style="line-height:21px;">stack(<span style="line-height:21px;font-family:'宋体';">栈<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">中所存的值来作为对比的依据,基本数据类型在<span style="line-height:21px;">stack<span style="line-height:21px;font-family:'宋体';">中所存的值就是其<span style="line-height:21px;">?<span style="line-height:21px;font-family:'宋体';">容值,而引用类型在<span style="line-height:21px;">stack<span style="line-height:21px;font-family:'宋体';">中所存放的值是本身所指向<span style="line-height:21px;">Heap<span style="line-height:21px;font-family:'宋体';">中对象的地址值。<span style="line-height:21px;">Java.lang<span style="line-height:21px;font-family:'宋体';">包中的<span style="line-height:21px;">Object<span style="line-height:21px;font-family:'宋体';">类有<span style="line-height:21px;">public boolean equals (Object obj)<span style="line-height:21px;font-family:'宋体';">方法。它比较两个对象是否相等。仅当被比较的两个引用指向同一对象时<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">句柄相等<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">,对象的<span style="line-height:21px;">equals()<span style="line-height:21px;font-family:'宋体';">方法返回<span style="line-height:21px;">true<span style="line-height:21px;font-family:'宋体';">。<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">至于<span style="line-height:21px;">String<span style="line-height:21px;font-family:'宋体';">类的<span style="line-height:21px;">equals()<span style="line-height:21px;font-family:'宋体';">方法,它重写<span style="line-height:21px;">(override)equals()<span style="line-height:21px;font-family:'宋体';">方法,不在本文讨论之列。<span style="line-height:21px;">) <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">6.<span style="line-height:21px;font-family:'宋体';">对象的创建和初始化过程 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 在<span style="line-height:21px;">java<span style="line-height:21px;font-family:'宋体';">中对象就是类的实例。在一般情况下,当把一个类实例化时,此类的所有成员,包括变量和方法,都被复制到属于此数据类型的一个新的实例中去。分析以下两段代码。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">6.1 Vehicle veh1 = new Vehicle(); <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 上面的语句做了如下的事情: <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> ①右边的“<span style="line-height:21px;">new Vehicle<span style="line-height:21px;font-family:'宋体';">”,是以<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">类为模板,在堆空间里创建一个<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">类对象<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">也简称为<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">对象<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> ②末尾的<span style="line-height:21px;">()<span style="line-height:21px;font-family:'宋体';">意味着,在对象创建后,立即调用<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果没创建,<span style="line-height:21px;">Java<span style="line-height:21px;font-family:'宋体';">会补上一个默认的构造函数。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> ③左边的“<span style="line-height:21px;">Vehicle veh1<span style="line-height:21px;font-family:'宋体';">”创建了一个<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">类引用变量。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> ④“<span style="line-height:21px;">=<span style="line-height:21px;font-family:'宋体';">”操作符使对象引用指向刚创建的那个<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">对象。<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">回想一下句柄与引用<span style="line-height:21px;">) <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 将上面的语句分为两个步骤: <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">Vehicle veh1; <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">veh1 = new Vehicle(); <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。在堆空间里创建的实体,与在栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是似乎很难准确的“抓”住它。我们仔细研究一下第二句,找找刚创建的对象叫什么名字<span style="line-height:21px;">?<span style="line-height:21px;font-family:'宋体';">有人说,它叫“<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">”。不对,“<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">”是类<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">对象的创建模板<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">的名字。一个<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">类可以据此创建出无数个对象,这些对象不可能全叫“<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">”。对象连名都没有,没法直接访问它。我们只能通过对象引用来间接访问对象。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">6.2 Vehicle veh2; <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">veh2 = veh1; <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 由于<span style="line-height:21px;">veh1<span style="line-height:21px;font-family:'宋体';">和<span style="line-height:21px;">veh2<span style="line-height:21px;font-family:'宋体';">只是对对象的引用,第二行所做的不过是把<span style="line-height:21px;">veh1<span style="line-height:21px;font-family:'宋体';">的引用<span style="line-height:21px;">(<span style="line-height:21px;font-family:'宋体';">地址<span style="line-height:21px;">)<span style="line-height:21px;font-family:'宋体';">赋值给<span style="line-height:21px;">veh2<span style="line-height:21px;font-family:'宋体';">,使得<span style="line-height:21px;">veh1<span style="line-height:21px;font-family:'宋体';">和<span style="line-height:21px;">veh2<span style="line-height:21px;font-family:'宋体';">同时指向唯一的一个<span style="line-height:21px;">Vehicle<span style="line-height:21px;font-family:'宋体';">对象。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <span style="line-height:21px;">6.3 veh2 = new Vehicle(); <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 则引用变量<span style="line-height:21px;">veh2<span style="line-height:21px;font-family:'宋体';">改指向第二个对象。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> 从以上叙述再推演下去,我们可以获得以下结论:①一个对象引用可以指向<span style="line-height:21px;">0<span style="line-height:21px;font-family:'宋体';">个或<span style="line-height:21px;">1<span style="line-height:21px;font-family:'宋体';">个对象<span style="line-height:21px;">;<span style="line-height:21px;font-family:'宋体';">②一个对象可以有<span style="line-height:21px;">N<span style="line-height:21px;font-family:'宋体';">个引用指向它。 <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,SimSun;font-size:14px;"> <span style="line-height:21px;font-family:'宋体';"> <p style="border:0px;list-style:none;line-height:21px;color:rgb(50,50);font-size:14px;"> <span style="font-family:'宋体';">转载地址:<a href="http://blog.sina.com.cn/s/blog_7ed8eb7d0101k057.html" rel="nofollow">http://blog.sina.com.cn/s/blog_7ed8eb7d0101k057.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |