《Java应用程序中的按值传递语义》的理解

文章作者 100test 发表时间 2008:02:01 14:53:01
来源 100Test.Com百考试题网



节选理解参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用传递参数,以避免因依赖“按引用传递”这一行为而导致的常见编程错误。

对此节选的某些反馈意见认为,我把这一问题搞糊涂了,或者将它完全搞错了。许多不同意我的读者用 C 语言作为例子。因此,在此栏目中我将使用 C 和 Java 应用程序进一步阐明一些事实。

要点
读完所有的评论以后,问题终于明白了,至少在一个主要问题上产生了混淆。某些评论认为我的节选是错的,因为对象是按引用传递的。对象确实是按引用传递的;节选与这没有冲突。节选中说所有参数都是按值 -- 另一个参数 -- 传递的。下面的说法是正确的:在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。但重要的是要区分参数是如何传递的,这才是该节选的意图。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。

C 和 Java 应用程序中的参数传递
Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。这是一个重要特性,正如随后的代码示例所示的那样。

在继续讨论之前,定义按值传递和按引用传递这两个术语是重要的。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。


上面的这些是很重要的,请大家注意以下几点结论,这些都是我认为的上面的文章中的精华和最终的结论:

1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本

首先我们来看看第一点:对象是按引用传递的
确实,这一点我想大家没有任何疑问,例如:


class Test01
{
public static void main(java/lang/String.java.html" target="_blank">String[] args)
{
java/lang/StringBuffer.java.html" target="_blank">StringBuffer s= new java/lang/StringBuffer.java.html" target="_blank">StringBuffer("good").
java/lang/StringBuffer.java.html" target="_blank">StringBuffer s2=s.
s2.append(" afternoon.").
java/lang/System.java.html" target="_blank">System.out.println(s).
}
}

对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。
如何解释“对象是按引用传递的”的呢?

这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的,有问题吗?
程序运行的输出是:
good afternoon.

这说明s2和s是同一个对象。

这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值)

相关文章


在FedoraLinux上安装JDK6_JavaSE6
J2SE实现windows下读取网卡的物理地址
J2EEdeploymentfiles(a lication-client.xml)-j2ee
J2EE项目中开发团队的组建-j2ee
《Java应用程序中的按值传递语义》的理解
J2ME开发中常见属性(Property)及其作用列表
JDBC和ODBC(转)-java基础
给JavaBea 增加XPath功能
JavaDevelopmentKit爆严重漏洞
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛