java中,一个方法可以修改传递引用所对应的变量值。这句话如何理解?

2024年11月22日 09:06
有3个网友回答
网友(1):

这里调用函数时,涉及参数传递,参数传递有两种方式,传值和传地址。在JAVA里,凡是引用类型(类、接口、枚举类型、数组)都是传地址,凡是基础类型(8种,如int、long)都是传值。tripleSalary(harry);这里的harry被存放在某个地址里,如果harry为引用类型,那么tripleSalary(harry);操作时,也是在harry原来的地址内进行的,即函数体内的x这个对象和harry对象两个对象的地址是完全一样的,x和harry有着相同的地址,自然是同一个对象,x这个对象可以理解成暂时换了个名字的harry对象,自然,对x做出的修改等于对harry的修改;那么传值呢,如果tripleSalary(harry);你传递进去的是基本数据类型,那么虚拟机会为x另外开辟一块内存,然后把harry内存中的内容,原原本本地复制到x的内存中,这时x和harry内存中的内容完全一样,也就是它们的值相同,但是它俩是两块不同的内存,对x所作的修改,自然不会影像到harry了。

网友(2):

首先
harry = new Employee(...);
你必须要知道,上面这句话创建了两个对象,一个是引用,一个是Employee实例对象
harry ------->> new Employee(...); //一个引用指向了一个实例对象,你可以理解为一个绳子harry牵了个气球 new Employee(...)
然后
tripleSalary(harry);
产生一个 harry的拷贝引用 x
现在 x-------->> new Employee(...) 这里可以理解为又有一个绳子连上了那个气球

这里 引用 x,harry 都可以直接操控到new Employee(...)这个对象

当x.raiseSalary(200);
一开始创建的new Employee(...)对象内容改变

至此,方法结束,引用x被gc回收,x这根线丢掉了
此时:只有 harry ------->> new Employee(...);//harry这根线还在

网友(3):

简单的方法可以是在实例化并且运行1.java的以后,在1.java中实例化2.java,并且在实例化2.java的时候将变量a传递过去~因此2.java就需要一个带参数的构造方法(构造函数)。