java句柄2010-01-19 12:331、首先弄清楚一个问题:Java有没有指针?
对于在C和C++里头曾经给我们带来欢乐同时也有无限痛苦的指针,很多人宁愿它再也不要出现在Java里头。然而事实上,Java是有指针的,Java中每个对象(除基本数据类型以外)的标识符都属于指针的一种。但它们的使用受到了严格的限制和防范,在<Thinking in Java>一书中称它们为句柄。
2、传递句柄
将句柄传递进入一个方法时,指向的仍然是相同的对象。
public class Testit {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Testit a = new Testit();
a.setName("a");
Testit b = new Testit();
b.setName("b");
System.out.println("before swap: " + "a=" + a + " name: " + a.getName());
swap(a,b);
}
private static void swap(Testit swap1, Testit swap2) {
System.out.println("swaping: " + "a= " + swap1 + " name: " + swap1.getName());
Testit temp;
temp = swap1;
swap1 = swap2;
swap2 = temp;
}
}
输出结果:
before swap: a=com.lib.Testit@16930e2 name: a
swaping: a= com.lib.Testit@16930e2 name: a
3、一个句柄的传递会使调用者的对象发生意外的改变。
public class Testit {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Testit a = new Testit();
a.setName("a");
Testit b = new Testit();
b.setName("b");
System.out.println("before swap: " + "a=" + a + " name: " + a.getName());
swap(a,b);
System.out.println("after swap: " + "a=" + a + " name: " + a.getName());
}
private static void swap(Testit swap1, Testit swap2) {
Testit temp;
temp = swap1;
swap1 = swap2;
swap2 = temp;
swap1.setName("a's name");
swap2.setName("b's name");
}
}
输出结果:
before swap: a=com.lib.Testit@16930e2 name: a
after swap: a=com.lib.Testit@16930e2 name: b's name
我们看到,a依旧是原来那个a,但name却不是原来那个name了!
在swap()方法中,swap1和swap2互相换过来了,这个时候swap2指向的是a,所以在setName()的时候改变的是a的name,而不是b的name。
为什么会这样呢?
liang_chen兄高见:Java里的传值实际上是拷贝引用,而不是拷贝对象。
总结:
1:对于值类型的参数来说,传递的是值的拷贝.
2:对于引用类型的参数来说,传递的是引用本身的拷贝.
所以关键要看你如何理解传值中的这个“值”了。
分享到:
相关推荐
3. 编写C/C++实现,包含生成的头文件并实现`getWindowHandle`方法,调用操作系统API获取句柄: ```c #include "NativeWindow.h" #include #include JNIEXPORT jlong JNICALL Java_NativeWindow_getWindowHandle...
System.out.println("找到窗口句柄:" + hWnd.toString()); // 在此处可以进行其他窗口操作 } else { System.out.println("没有找到匹配的窗口"); } } } ``` 获取窗口句柄后,我们可以通过`User32`类提供的...
Java调用Win32 API获取窗口句柄是一个跨平台编程中的常见需求,特别是在需要与操作系统进行深度交互的应用中。JNative库是实现这一目标的一种工具,它允许Java代码通过JNI(Java Native Interface)来调用C/C++编写...
在使用Windows操作系统时,有时会遇到“内存不足”的问题,这会影响我们运行程序或执行任务。以下是六个解决内存不足问题的策略,可以帮助你摆脱困境。 首先,剪贴板占用过多内存是一个常见原因。...
5. **获取窗口句柄:** - 在 Windows 平台上,通过 `JAWT_Win32DrawingSurfaceInfo` 结构体中的 `hwnd` 字段来获取窗口的句柄。 #### 四、示例代码解析 下面是对给定代码片段的详细解析: ```c #include #...
Java方法句柄是Java语言提供的一种高级特性,它允许程序以更灵活的方式处理方法调用。这个特性在Java 7引入,主要用于动态类型语言的实现和高性能的代码生成。方法句柄提供了对方法的直接访问,类似于C/C++中的函数...
System.out.println("窗口句柄: " + hWnd.toString()); } else { System.out.println("窗口未找到"); } } } ``` 在这个例子中,我们使用`FindWindow`方法查找具有特定标题的窗口,并返回其句柄。句柄通常用于...
事件对象句柄则是Windows操作系统中的一种同步机制,用于线程间的通信和资源协调。在本主题中,我们将深入探讨这两个概念以及如何使用特定的进程管理工具来分析事件对象句柄。 首先,我们来理解什么是进程。在...
9. **新的反射API**:`java.lang.invoke`包提供了更强大的反射能力,可以创建和操作方法句柄。 10. **增强的日志框架**:Java Logging API得到了改善,允许更灵活的日志配置和控制。 以上是Java 6中的一些关键特性...
7. **动态类型语言支持**:Java 7支持JSR 292,即“方法句柄”和“invokedynamic”指令,这为实现动态类型语言如Groovy、JRuby等在Java平台上运行提供了基础。 8. **并发改进**:Java 7对并发API进行了一些优化,如...
- Java没有直接的文件句柄概念,而是通过类库来间接操作文件系统。这种设计简化了文件操作的复杂性,但也可能限制了一部分底层控制的需求。 4. **安全性和封装**: - Java拥有严格的类型检查和权限控制机制,能够...
本文将深入探讨“演示ClientSocket反复连接进程句柄数不变”这个主题,以及如何解决由此引发的问题,如句柄数增加、系统资源耗尽和死机。 首先,让我们理解什么是ClientSocket。ClientSocket是Delphi中的一个组件,...
所以,本人根据Java的监听器概念实现的观察者模式,重新用C#代码来描述了C#的难点技术--代理、事件、事件句柄--^_^...希望能够给C#的fan们带来帮助。 阅读条件:熟悉C#语言,会使用csc命令。 阅读人员:非常熟悉...
3. **JEP 325:Variable Handles**:变量句柄是一种安全、高效地访问存储在堆或栈上的变量的方法。它为内存模型提供了一种更强大的抽象,对于高级语言特性,如不可变性或线程局部存储,非常有用。 4. **JEP 331:...
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.Reader; /** * @author...
在IT行业中,句柄是一个非常重要的概念,尤其是在操作系统和编程领域。句柄是操作系统分配给对象(如进程、线程、窗口、文件等)的一个唯一标识符,它用于应用程序访问和操作这些对象。在Windows API中,句柄被广泛...
3. **技术栈准备**:开发团队应具备相关的编程技能,如PowerBuilder或Java等,并且熟悉相关的开发工具。 #### 三、医保接口系统访问地址说明 - **测试地址**:该地址主要用于开发阶段的测试,通常位于互联网上,...
在本场景中,"删除程序的 mutex 互斥句柄" 涉及到游戏外挂和DLL(动态链接库)的使用,这通常是程序员为了实现特定功能,如防止游戏多开或者进行一些非正规的游戏修改。 首先,我们来详细解释一下互斥句柄(Mutex ...
Memcached Cache现在已经被大家广泛使用,但是千万不要认为对Cache的操作是低损耗的,要知道这类集中式Cache对Socket连接数(会牵涉到linux操作系统文件句柄可用数),带宽,网络IO都是有要求的,有要求就意味着会有...