Java中的值传递和引用传递

来源:互联网 发布:mac 百度云太慢 编辑:程序博客网 时间:2024/06/05 11:47

Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。

    如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值.
    如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址指向的内容的的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。
 
Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。

转自http://yqsshr.blog.51cto.com/469059/147695

(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,就是直接使用双引号定义字符串方式:String str = “Java私塾”,其它的都是按引用传递。

转自http://bbs.csdn.net/topics/90058535

(1) 在JAVA中,一个基本类型的变量直接代表那个值本身,而一个类类型(或数组类型)的变量则是一个引用,间接地代表着它所引用的那个对像;
(2) 不管是引用类型还是基本内型的变量,就变量本身而言,做参数传递时,都是值传递的语义——你永远无法改变传递的变量本身。
(3) 因为(2),在方法内部对形参值的直接修改不影响实参;
(4) 但引用类型由于本身引用着一个实际的对象,因此可以通过它来修改对象的分量而且使得这种改变对方法外部的实参可见;
(5) 第(4)条所说的“分量”既包括数组的元素,也包括类的字段;
(6) 由于(4),(5),通过数组或类的包装,可以间接实现让方法内对象的改变影响到方法外部。

    传值:直接传递数值。变量与变量之间,值与值之间互不影响。
    传参:传参考,就是传引用。打个比方,每传递一个引用就相当于多了一个遥控器,这些遥控器都能操作同一台电视机。如果其中一台遥控器转而操作另一台电视机,并不影响其它遥控器对原电视机的操纵。
    传址:传递变量的地址。c++里面常用,使用“&”操作符把变量的地址传递给另一个变量。通过后一个变量,除了能改变前一变量所引用的对象,还能改变前一变量所持有的引用,即,是前一变量引用另外的对象。

另外:注意Java中的数组是运行时生成的一个特殊的类的对象而已,和C语言的数组完全不同的概念,只是用法、语法类似。

原创粉丝点击