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”。