我的一些理解相当于下面片文章的一些笔记
http://java.chinaitlab.com/base/766225.html
Java只有一种传递参数的方式,那就是按照值来传递的
首先我们知道,在编译原理中,有两种传递参数的方式,按值传递和按引用传递
按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。
因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。
按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,
而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
Java里面有这么一种说法
O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best:
"Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'"
“
在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。
但重要的是要区分参数是如何传递的,这才是该节选的意图。
Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。
参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。
”
对于这句话我的理解是:
在Java中的确是按照引用来传递对象的,但是这和按引用传参是两个概念
按引用传递对象是什么一个概念呢
比如说
class A a=new A();
class A b=new A();
a=b;
a=b;这个操作就是按引用来传递的,a接受的是b的引用,而不是b的对象
这个例子就是按引用来传递对象的一种情况
按引用来传递对象,不代表按引用传递参数
在Java中一定是按值传参的,
不要以为这个“值”只能是基本类型的值,这个“值”还可以是对象引用
也就是对象的引用作为“值”来进行传递。
按值传参也可以按值传“引用”
对于test4的一些解释
当程序调用了test(s,s2)时 s,s2的引用作为值传递给方法,相当于有两个副本s',s2这两个
拷贝了s,s2的引用,s',s2'都指向s和s2的地址
s-->|good | <-------s'
s2-->|bad | <-------s2'
这个时候输出test中的1、2句就出现
“
good
bad
”
第三句 s2=s;后变成了
s-->|good | <-------s'
s2-->|bad | └─---s2'
执行第4句之后 就变成了这样
s-->|good | <---- s'------->|new |
s2-->|bad | └─---s2'
所以第5、6句的输出结果是
“
new
good
”
第七句第八句的后就变成了这样
s-->|goodhah | <---- s'------->|newhah |
s2-->|bad | └─---s2'
返回主函数
我们最后两句输出的还是s和s2的引用所值的东西,这两个变量的引用就没有变化
只是里面的内容发生了变化,所以输出的结果是
“
goodhah
bad
”
http://java.chinaitlab.com/base/766225.html
Java只有一种传递参数的方式,那就是按照值来传递的
首先我们知道,在编译原理中,有两种传递参数的方式,按值传递和按引用传递
按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。
因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。
按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,
而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
Java里面有这么一种说法
O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best:
"Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'"
“
在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。
但重要的是要区分参数是如何传递的,这才是该节选的意图。
Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。
参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。
”
对于这句话我的理解是:
在Java中的确是按照引用来传递对象的,但是这和按引用传参是两个概念
按引用传递对象是什么一个概念呢
比如说
class A a=new A();
class A b=new A();
a=b;
a=b;这个操作就是按引用来传递的,a接受的是b的引用,而不是b的对象
这个例子就是按引用来传递对象的一种情况
按引用来传递对象,不代表按引用传递参数
在Java中一定是按值传参的,
不要以为这个“值”只能是基本类型的值,这个“值”还可以是对象引用
也就是对象的引用作为“值”来进行传递。
按值传参也可以按值传“引用”
对于test4的一些解释
当程序调用了test(s,s2)时 s,s2的引用作为值传递给方法,相当于有两个副本s',s2这两个
拷贝了s,s2的引用,s',s2'都指向s和s2的地址
s-->|good | <-------s'
s2-->|bad | <-------s2'
这个时候输出test中的1、2句就出现
“
good
bad
”
第三句 s2=s;后变成了
s-->|good | <-------s'
s2-->|bad | └─---s2'
执行第4句之后 就变成了这样
s-->|good | <---- s'------->|new |
s2-->|bad | └─---s2'
所以第5、6句的输出结果是
“
new
good
”
第七句第八句的后就变成了这样
s-->|goodhah | <---- s'------->|newhah |
s2-->|bad | └─---s2'
返回主函数
我们最后两句输出的还是s和s2的引用所值的东西,这两个变量的引用就没有变化
只是里面的内容发生了变化,所以输出的结果是
“
goodhah
bad
”