有关java中的引用问题
2010-03-15 16:36
232 查看
首先,java对对象和基本类型的处理是不一样的,和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。
此外,在任何用“=”向对象变量赋值的时候都是"引用传递"。如:
但由于没有相应的引用,对这个对象的使用也只能局限这条语句中了。
产生:引用总是在把对象作参数"传递"的过程中自动发生,不需要人为的产生,也不能人为的控制引用的产生。这个传递包括把对象作为函数的入口参数的情况,也包括用"="进行对象赋值的时候。
范围:只有局部的引用,没有局部的对象。引用在Java语言的体现就是变量,而变量在Java语言中是有范围的,可以是局部的,也可以是全局的。
生存期:程序只能控制引用的生存周期。对象的生存期是由Java控制。用"new Object()"语句生成一个新的对象,是在计算机的内存中声明一块区域存储对象,只有Java的垃圾收集器才能决定在适当的时候回收对象占用的内存。
没有办法阻止对引用的改动。
此外,在任何用“=”向对象变量赋值的时候都是"引用传递"。如:
package reference; class PassObj { String str = "init value"; } public class ObjPassValue { public static void main(String[] args) { PassObj objA = new PassObj(); PassObj objB = objA; objA.str = "changed in objA"; System.out.println("Print objB.str value: " + objB.str); } } /* RUN RESULT Print objB.str value: changed in objA */
第一句是在内存中生成一个新的PassObj对象,然后把这个PassObj的引用赋给变量objA,第二句是把PassObj对象的引用又赋给了变量objB。此时objA和objB是两个完全一致的变量,以后任何对objA的改变都等同于对objB的改变。 Hashtable并不能真正存储能对象,而只能存储对象的引用。 所以,Hashtable不能真的存储对象,只能是对象的引用。import java.util.*; public class HashtableAdd{ public static void main(String[] args){ Hashtable ht = new Hashtable(); StringBuffer sb = new StringBuffer(); //append 只在StringBuffer中有. sb.append("abc,"); ht.put("1",sb); sb.append("def,"); ht.put("2",sb); sb.append("mno,"); ht.put("3",sb); sb.append("xyz,"); ht.put("4",sb); sb.append("uuu"); ht.put("5", sb); //一个输出的形式. //ht.element按顺序获取这些元素. 必须以这种 Enumeration 形式获取. Enumeration it = ht.elements(); //其实hasMoreElements本身就是有一个暂停的机制的,循环次数取决于有Hashtable 列表中有多少个对象的引用 //while(it.hasMoreElements()){ //nextElement()是一个一个的显示此Enumeration的元素. System.out.println(it.nextElement()); } 类,对象与引用 Java最基本的概念就是类,类包括函数和变量。如果想要应用类,就要把类生成对象,这个过程被称作"类的实例化"。有几种方法把类实例化成对象,最常用的就是用"new"操作符。类实例化成对象后,就意味着要在内存中占据一块空间存放实例。想要对这块空间操作就要应用到对象的引用。引用在Java语言中的体现就是变量,而变量的类型就是这个引用的对象。虽然在语法上可以在生成一个对象后直接调用该对象的函数或变量,如:
new String("Hello NDP")).substring(0,3) //RETURN RESULT: Hel |
产生:引用总是在把对象作参数"传递"的过程中自动发生,不需要人为的产生,也不能人为的控制引用的产生。这个传递包括把对象作为函数的入口参数的情况,也包括用"="进行对象赋值的时候。
范围:只有局部的引用,没有局部的对象。引用在Java语言的体现就是变量,而变量在Java语言中是有范围的,可以是局部的,也可以是全局的。
生存期:程序只能控制引用的生存周期。对象的生存期是由Java控制。用"new Object()"语句生成一个新的对象,是在计算机的内存中声明一块区域存储对象,只有Java的垃圾收集器才能决定在适当的时候回收对象占用的内存。
没有办法阻止对引用的改动。
相关文章推荐
- java String类有关静态变量,常量池,引用对象的问题
- Java传参的值传递和引用传递问题(转)
- 又一波 有关 java 静态代码块 代码块 构造函数执行顺序问题
- 有关引用的创建控件错误问题
- Java 中与时间有关的几个问题
- AndroidStudio 多个第三方so文件重复引用导致 java.lang.UnsatisfiedLinkError 问题
- 关于java中对象的循环引用问题
- java中,引用对象时常遇到的问题
- java中有关参数传递的问题
- java的库、包、编辑单元、类,以及系统库和第三方库的引用问题。
- Java 5个人坐在一起(有关第五个人岁数的问题)
- Java面试准备七:Java值传递/引用传递的问题
- 关于Java调用批处理命令向mysql导入数据的中文乱码有关问题
- VC中超前引用有关问题-error C2079: '' uses undefined class
- 有关java中resultSet的问题
- 有关Java Web 中CheckBox提交的问题
- catalina.sh设置JAVA_HOME后还无法解决更换JDK有关问题
- 有关安卓java版本不对问题的解决方法
- 总结java方法(函数)传值和传引用的问题
- java中的值传递和引用传递问题