`

Java 对象句柄

    博客分类:
  • Java
阅读更多

       每种编程语言都有自己的数据处理方式。有些时候,程序员必须时刻留意准备处理的是什么类型。您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C或C++里的指针)?
      所有这些在Java里都得到了简化,任何东西都可看作对象。因此,我们可采用一种统一的语法,任何地方均可照搬不误。但要注意,尽管将一切都“看作”对 象,但操纵的标识符实际是指向一个对象的“句柄”(Handle,也就是包装类的申明)。在其他Java参考书里,还可看到有的人将其称作一个“引用”, 甚至一个“指针”。可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频 道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上 拿着的是遥控板,而非电视机。
       此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。所以如果想容纳一个词或句子,可创建一个String句柄:
      String s;
      但这里创建的只是句柄,并不是对象。若此时向s发送一条消息,就会获得一个错误(运行期)。这是由于s实际并未与任何东西连接(即“没有电视机”)。
       需要注意的是:主类型的数据成员可直接初始化,是变量,不是句柄。
       String s; 创建的只是句柄,并不是对象。若此时向s发送一条消息,就会获得一个错误(运行期),这是由于s实际并未与任何东西连接。因此,一种更安全的做法是:创建一个句柄时,记住无论如何都进行初始化:
       String s = "asdf";
      然而,这里采用的是一种特殊类型:字串可用加引号的文字初始化。通常,必须为对象使用一种更通用的初始化类型。创建句柄时,通常用new关键字达到这一目的。new的意思是:“把我变成这些对象的一种新类型”。
       String s = new String("abc");它不仅指出“将我变成一个新字串”,也通过提供一个初始字串,指出了“如何生成这个新字串”。
        这里在堆(heap)中创建一个string 对象,还会在文字池(string pool)里面创建一个"abc"对象;s是这个对象的引用变量(句柄),它不是对象,对象一般通过new创建。

字符串对象的创建:

由 于字符串对象的大量使用(它是一个对象,一般而言对象总是在heap分配内存),Java中为了节省内存空间和运行时间,在编译阶段就把所有的字符串文字 放到一个文字池(pool of literal strings)中,而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。
我们知道,对两个引用变量,使用==判断它们的值(引用)是否相等,即指向同一个对象:
这里 s1 == s2 成立  //因为比较的不是句柄,而是内容
String s = new String("abc") ; 在编译阶段在文字池中创建“abc”对象,运行new时,将pool中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s持有,因此这条语句创建了2个String对象。

String s1 = "abc" ;
String s2 = "abc" ; 
 

这里 s1 == s2 不成立,s1.equals(s2)成立  //因为比较的是句柄,内容虽然相同但句柄不同
上面的代码创建了几个String Object? (三个,pool中一个,heap中2个。)

 

参考来源:
1.http://zhidao.baidu.com/question/15950414.html
2.http://blog.sina.com.cn/s/blog_4b622a8e0100c28z.html

分享到:
评论

相关推荐

    进程管理工具 可用来分析事件对象句柄

    进程管理工具 可用来分析事件对象句柄.

    java对象的概念-new.docx

    2.1 用句柄操纵对象 每种编程语言都有自己的数据处理方式。有些时候,程序员必须时刻留意准备处理的是什么类型。您曾利用 一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C 或C++里的指针)? 所有...

    findjobj - 查找 Matlab 图形对象的 java 句柄:查找包含在指定 java 容器或 Matlab GUI 句柄中的 java 对象-matlab开发

    查找包含在 java 容器或 Matlab GUI 句柄中的所有 java 对象如果未指定输出参数,则将显示一个交互式 GUI 窗口,其中包含所有容器组件、它们的属性和回调的树视图。 句法: [handles,levels,parentIds,listing] = ...

    Recycler:自动回收IBM Domino Java对象-开源

    当然,它们必须回收,因为您不知道最终应用程序将使用多少个对象句柄,并且如果不回收,您的对象可能过多。 另一方面,库绝不能回收任何Domino对象。 您可能知道,每个Domino对象最多只能有一个Java对象。 而且,...

    UIINSPECT - 显示对象的方法、属性和回调:检查对象句柄 (Java/COM/HG); 在统一窗口中显示其方法/属性/回调-matlab开发

    句法: hFig = uiinspect(obj) 描述: UIINSPECT 检查对象句柄(例如,Java、COM、Handle Graphics、Matlab 类、Dot-Net 等)并在统一的 Matlab 窗口中显示检查结果。 UIINSPECT 显示一个统一的窗口,其中包含所有...

    ObjDiff - 通用对象比较器:比较任何类型的对象。 Java、Matlab、HG 句柄、结构、单元和数组-matlab开发

    与 Matlab 的 SETDIFF 或 SETXOR 不同,该 OBJDIFF 还比较结构、GUI 句柄、ActiveX、Matlab 和 Java 对象,以及数组和单元格。 与 SETDIFF/SETXOR 不同,OBJDIFF 还允许比较数值元胞数组。 它还接受 SETDIFF/SETXOR...

    Java编程思想(完整版)

    在本章,我们将探讨Java程序的基本组件,并体会为什么说Java乃至Java程序内的一切都是对象。 2.1 用句柄操纵对象 2.2 必须创建所有对象: 创建句柄时,我们希望它同一个新对象连接。通常用new关键字达到这一目的。...

    JAVA并发.pdf

    线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进程所创建的对象资源(内存资源)。java.lang.Thread对象负责统计和控制这种行为。 每个程序都至少...

    java 编程入门思考

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    用Java实现非阻塞通信

    用Java实现非阻塞通信 java.nio包提供了支持非阻塞通信的类,主要包括: ● ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信。 ● SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信...

    matlab开发-findjobjfindjavahandlesofmatlabgraphicb对象

    matlab开发-findjobjfindjavahandlesofmatlabgraphicb对象。查找包含在指定Java容器或Matlab GUI句柄中的Java对象

    Java初学者入门教学

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java联想(中文)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    张孝祥Java就业培训教程.pdf

    3.4 this引用句柄 3.5 与垃圾回收有关的知识 3.6 函数的参数传递 3.7 Static关键字 3.8 内部类 3.9 使用Java的文档注释 第4章 面向对象(下) 4.1 类的继承 4.2 抽象类与接口 4.3 对象的多态性 4.4 异常 4.5 包 4.6 ...

    JAVA_Thinking in Java

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Thinking in Java简体中文(全)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Thinking in Java 中文第四版+习题答案

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct...

    新手入门写Java程序的三十个基本规则

    字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如:  ThisIsAClassName  thisIsMethodOrFieldName  若在定义中出现了常数初始化...

    Java语言对象访问的背后

     那Object obj这个引用变量会存放在java栈的本地变量表中,作为一个reference类型数据,它指向了一个对象的引用,即指向堆中对象起始地址的引用指针或一个代表对象的句柄,不同的虚拟机有不同的实现,这在接下来会...

Global site tag (gtag.js) - Google Analytics