package com.xzq;
/**
* @program: java8_demo
* @description: java中传值和传引用
* @author: XZQ
* @create: 2020-01-10 18:51
**/
public class TestTransferValue {
public void chanageValue1(int age) {
age = 20;
}
public void chanageValue2(Person person) {
person.setName("张飞");
}
public void chanageValue3(String str) {
str = "abc";
}
public static void main(String[] args) {
TestTransferValue testTransferValue = new TestTransferValue();
int age = 10;
testTransferValue.chanageValue1(age);
System.out.println(age);
System.out.println("-----------------------------------");
Person person = new Person();
person.setName("宋江");
testTransferValue.chanageValue2(person);
System.out.println(person.getName());
System.out.println("-----------------------------------");
String str = "xxx";
testTransferValue.chanageValue3(str);
System.out.println(str);
}
}
class Person {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
运行结果:
10
-----------------------------------
张飞
-----------------------------------
xxx
一、
对于changeValue1,属于传值,将age复制一份传给changeValue1。
但是输出依然是main方法中的age,作用域不同。
如图所示,changeValue1中的age并没有和main方法中的三个age一样高亮显示。
二、
对于changeValue2,属于传引用类型,是将引用(内存地址)传递给changeValue2;
如图所示,空心箭头代表Main线程的,实心箭头代表changeValue2的。
三、
这题很坑,对于changeValue3,也是传引用类型,而与Person不同的是,String是字符串是一个特殊的数据类型,它的底层是一个final 型的ch[]数组,属于无法更改,所以字符串在作为参数传递时,可以当做一个特殊的数组进行操作,同样的它也是将复制一份原本的对象引用给了副本,此时副本对象的引用和原本对象的引用都指向原始字符串的位置,也就是str和在刚开始初始化时它指向的地址和原对象str(main中)指向的位置一致,即str的初始hashcode值和原对象str(main中)的hashcode值一样,str经过str=“abc”操作后,由于字符串的不可变性,此时会str一个新的对象引用,即此时str指向“abc”的位置。str的hashcode值会变化,但是原本str(main中)它的对象引用没有发生改变,并且“xxx”也未发生改变,所以str(main中)任然指向”xxx”。