对java只有按值传递的理解
1。首先要理解对象与对象引用:
在新建一个对象时 Person p = new Person();
- 其中Person是类(即创建对象的模板);
- 右边 new Person() 新建了一个对象,放在了堆内存内;
- 左边 Person p 新建了一个Person类型的引用 p;
- = 令 引用 p 指向新创建出来的对象;
此时可以通过引用 p 调用或修改对象里的内容。
2。进行传值时:
第一种情况,基本类型(如int,double,long 等),看下面例子。
int i=1;
int j=i;
i=2;
System.out.println(i);
System.out.println(j);
此时的输出 为 2 和 1 , 令 j = i 后 ,i 改变了其值,但是 j 还是为 1
说明int j = i; 仅仅只是将 i 的值传给了 j ,所以 i 改变了其值,j 不会做改变。
第二种情况,对象的传值操作,依旧看个例子。
package testWeb; public class Person { public String str1 = "a"; public String str2 = "b"; public void changeValue(Person p){ p.str1 = "c"; p.str2 = "d"; } public void changeObject(Person p){ p =new Person(); p.str1 = "c"; p.str2 = "d"; } public static void main(String[] args) { Person p1 = new Person(); p1.changeValue(p1); //调用该方法将引用 p1 的【复制引用】传递给changeValue方法,方法内通过引用更改了对象的属性。 注意传递的时引用的复制 System.out.println(p1.str1);// 所以这里输出 c System.out.println(p1.str2); // 这里输出 d Person p2 = new Person(); p2.changeObject(p2);//这里也时传的引用的复制,所以 复制的引用 重新 new Person()指向了新的对象, 此时changeObject()方法了 通过复制的引用修改的就是新的对象的属性, p2引用所指向对象属性内容没有变更。 System.out.println(p2.str1);//所以这里输出 a System.out.println(p2.str2);//这里输出 b } }
看到这儿,看着对象这不是传递引用吗, 怎么说是按照值传递 。
这就要理解 "按引用传递" 与 "传递的是引用" 的差别, 传递的实际是对象的引用的值。 接收方会根据这个值,再生成一个对该对象的引用。 所以此时这两个引用是两个独立的引用。
而传递引用的意思是接收方与传递方 是同一个引用。在C++中有这种现象。java中则不存在。