对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中则不存在。

  

 

  

原文地址:https://www.cnblogs.com/heiniao/p/6528333.html