賦值與傳遞java
結論:this
1) 對於簡單類型變量的賦值是按值傳遞。就是說直接把數值存放到變量的存儲單元裏。spa
2) 對於引用類型的變量,賦值是把原對象的引用(能夠理解爲入口地址),存放在變量的存儲單元裏。對象
簡單類型的賦值很容易理解,這裏僅討論對象的賦值。全部引用類型的實例就是咱們常說的對象。內存
能夠這樣說,除了null之外,任何變量的初始賦值都是分兩步:class
1) 建立對象實例變量
2) 把對象實例的引用賦值給變量。數據類型
好比:引用
Object o1 = new Object();程序
傳遞是經過變量之間的賦值實現的。在之前的回貼中我說過這樣一句話,單純從變量的角度看,變量之間的賦值是值傳遞。如今我解釋一下個人觀點。
先舉一個例子:
// java中全部的類的基類默認爲Object,在此不贅述。
class Object1 {}
class Object2 {}
Object o1, o2;
o1 = new Object1();
o2 = o1;
o2 = new Object2();
這時候,o1的類型是什麼?是Object1仍是Object2?正確答案是Object1。
再舉一個例子:
class Word {
String word;
public Word(String word){
this.word = word;
}
public void print(){
System.out.println(word);
}
}
Word o1, o2;
o1 = new Word("Every Day");
o2 = o1;
o2 = new Word("Every Night!");
w1.print();
會出現什麼結果?"Every Day" 仍是 "Every Night!"?仍然是"Every Day"。
這裏面有一個不少人特別是初學者忽視了的觀點 ―― 變量能夠引用對象,但變量不是對象。什麼是對象?對象初始化以後,會佔用一塊內存空間,嚴格意義上講,這段內存空間纔是對象。對象建立於數據段,而變量存在於代碼段;對象的入口地址是不可預知的,因此程序只能經過變量來訪問對象。
回到咱們的問題上來,第一句
o1 = new Word("Every Day");
首先建立一個Word實例,即對象,而後把「引用」賦值給o1。
第二句
o2 = o1;
o1把對象的引用賦值給o2,注意賦的值是對象的引用而不是o1自身的引用。因此,在的三句
o2 = new Word("Every Night!");
就是又建立一個新對象,再把新對象的引用賦值給o2。
由於o1和 o2之間是值傳,因此,對o2的改變絲絕不會影響到o1。
也有一種狀況好像是影響到了o1,咱們繼續上面的例子,給Word增長一個方法
class Word {
String word;
public Word(String word){
this.word = word;
}
public void print(){
System.out.println(word);
}
public void setWord(String word){
this.word = word;
}
}
Word o1, o2;
o1 = new Word("Every Day");
o2 = o1;
o2.set Word("Every Night!");
o1.print();
這時的結果是"Every Night!"。
那麼,這是改變了o1嗎?從嚴格意義上講,不是。由於o1只是保存對象的引用,執行以後,o1仍是持有該對象的引用。因此,o1沒變,變的是o1所引用的對象。
變量賦值時會先把原先的值清除,而後再把新的值放入變量的地址中(基本數據類型)