每种编程语言都有自己的数据处理方式。有些时候,程序员必须时刻留意准备处理的是什么类型。您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(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
分享到:
相关推荐
事件对象句柄则是Windows操作系统中的一种同步机制,用于线程间的通信和资源协调。在本主题中,我们将深入探讨这两个概念以及如何使用特定的进程管理工具来分析事件对象句柄。 首先,我们来理解什么是进程。在...
其中 `JNIEnv *env` 是 JNI 环境指针,`jobject window` 是 Java 层传来的窗口对象。 3. **初始化 JAWT 结构体:** - `JAWT awt;` 初始化 JAWT 结构体。 - `awt.version = JAWT_VERSION_1_3;` 设置版本号。 4. *...
在Java编程环境中,获取窗口句柄(Window Handle)通常是与操作系统进行交互的一种方式,主要用于控制或检测特定的图形用户界面(GUI)元素。在Java中,这种操作涉及到AWT(Abstract Window Toolkit)和Swing库,这...
Java方法句柄是Java语言提供的一种高级特性,它允许程序以更灵活的方式处理方法调用。这个特性在Java 7引入,主要用于动态类型语言的实现和高性能的代码生成。方法句柄提供了对方法的直接访问,类似于C/C++中的函数...
7. **释放资源**:在完成所有操作后,记得释放分配的资源,例如,使用`DeleteLocalRef`删除不再需要的Java对象句柄。 压缩包中的文件可能包括以下内容: - **README.TXT**: 提供了简要的使用指南或注意事项。 - **...
#### 一、Java对象、引用及创建过程 在Java中,对象是程序的基本单位,它包含了属性(成员变量)和行为(方法)。对象是由类创建出来的实例,而类则是一组具有相同属性和行为的对象的模板。 ##### 1. 对象创建与...
3. **堆**:用于存储Java对象,提供更大的灵活性,因为编译器不需要知道对象的具体大小和生存期。在堆中分配对象需要更多时间,但允许动态分配和回收。 Java程序员不必直接管理这些内存区域,垃圾收集器会自动处理...
面向对象编程是软件开发中的一种核心思想,尤其在Java这样的面向对象语言中至关重要。它与传统的面向过程编程有着显著的区别。面向对象编程(OOP)强调的是数据和操作这些数据的函数(方法)的组合,即对象。在这个...
Java 对象初始化过程详解 Java 对象的初始化过程是通过 new 指令开始的,首先会根据指令参数在常量池中定位到一个类的符号引用。如果没有定位到这个符号引用,那么这个类就没有被加载,就需要 JVM 进行类的加载。...
总的来说,理解Java对象的创建、句柄的概念以及引用的工作方式,对于编写高效、健壮的Java代码至关重要。这不仅涉及内存管理,还关乎对象间的交互和数据安全。在实际开发中,熟练掌握这些知识能帮助我们更好地设计和...
3. 如果对象包含不可克隆的资源(如文件句柄、数据库连接等),在克隆时需特别处理,避免资源冲突。 4. 克隆可能会带来性能开销,对于大量对象的复制,要考虑其他替代方案,如拷贝构造函数或序列化。 5. 避免使用`...
要截取特定区域,我们需要指定一个`Rectangle`对象来定义截图的坐标和大小。例如: ```java Robot robot = new Robot(); Rectangle rect = new Rectangle(x, y, width, height); // x, y是左上角坐标,width, ...
句柄是操作系统分配给对象(如进程、线程、窗口、文件等)的一个唯一标识符,它用于应用程序访问和操作这些对象。在Windows API中,句柄被广泛使用,使得程序能够安全地与系统资源交互。 标题“读取其他程序句柄”...
查找包含在 java 容器或 Matlab GUI 句柄中的所有 java 对象如果未指定输出参数,则将显示一个交互式 GUI 窗口,其中包含所有容器组件、它们的属性和回调的树视图。 句法: [handles,levels,parentIds,listing] = ...
在Windows系统中,互斥对象是一种内核对象,可以被用来保护全局数据,确保任何时候只有一个线程可以访问。创建互斥体后,线程可以通过调用`CreateMutex()`函数获取一个互斥句柄。这个句柄用于后续的`...
在Java中,使用关键字`new`来创建对象,并通过赋值操作符`=`将对象句柄与新创建的对象关联起来。例如: ```java String str = new String("Hello"); ``` 这段代码中,`str`是对象句柄,`String`是类名,`new ...
Java对象的生命周期开始于`new`关键字,它在堆内存中分配空间,并调用构造方法初始化对象。对象一旦创建,其内存地址就在堆中保持不变,即使其他内存管理操作发生。引用就像句柄一样,始终指向对象的内存地址,确保...
函数首先获取构造函数的句柄,然后使用NewObject函数实例化Java类,最后返回实例化后的Java对象。 获取构造函数的句柄时需要注意,GetMethodID函数的参数分别为类句柄、方法名称和参数名称。不同的方法名称和参数...
其中,`hHandle`是MATLAB图形句柄,可以是一个窗口、面板、按钮等,而`hJava`返回的是对应Java对象的句柄。通过这个句柄,我们可以调用Java对象的方法,或者访问它的属性。 `findjobj`有两种实现方式:`findjobj.m`...