初學者很多人剛開始都分不清Java中的引用到底是值傳遞還是對象傳遞杖们,現(xiàn)在我們就來用幾個例子來分析下這個的概念腔长,引用的概念是Java們必須弄懂的雖然簡單但是非常非常的重要。
- 8種基本數(shù)據類型 int double string char float short long byte只要創(chuàng)建出來都是存儲在stack中,當有傳遞的時候都是直接創(chuàng)建新的值医寿,運算后數(shù)據都是分開獨立的赵讯。
/**
* 測試方法
* @param args
*/
public static void main(String[] args) {
int price = 10;
System.out.println("*****"+price+"*****");
setPrice(price);
System.out.println("*****"+price+"*****");
}
public static void setPrice(int p){
p+=10;
System.out.println("*****"+p+"*****");
}
輸出
*****10*****
*****20*****
*****10*****
經過簡單的實驗基本數(shù)據類型傳遞是值傳遞盈咳,互相都是獨立的不會影響到原數(shù)據。
2.接下來看下對象的傳遞是值傳遞還是引用傳遞
/**
* 測試方法
* @param args
*/
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("你好");
System.out.println(builder);
addString(builder);
System.out.println(builder);
}
public static void addString(StringBuilder builder){
builder.append("歡迎!");
}
輸出
你好
你好歡迎!
------
//分析:可以看到傳遞builder到addString方法后做了append的操作边翼,輸出了原builder的引用值受到了影響鱼响。
二個builder引用指向的都是同一個內存地址中的值,改變其中一個另外一個也會受到影響,
所以對象傳遞的是引用组底,多個引用可以指向一個地址丈积,改變其中一個另外的也會受到影響筐骇。
再看把addString修改下
public static void addString(StringBuilder builder){
builder = new StringBuilder();
builder.append("歡迎!");
}
輸出
你好
你好
------
//分析:addString方法做了個builder = new StringBuilder()操作后二次打印居然是一樣的了,沒有改變到原值了江滨。
StringBuilder builder = new StringBuilder("你好")在stack中開辟了builder引用
addString方法中的參數(shù)值也會在stack中開辟引用它們都是指向一個地址铛纬,addString方法中builder = new StringBuilder()
會重新開辟新的內存地址指向歡迎后,它們二個引用指向的就不是一個地址了而是二個唬滑,所以其中一個改變了不會影響到另外一個告唆。