Java變量的賦值與傳遞

賦值與傳遞java

結論:this

1)      對於簡單類型變量的賦值是按值傳遞。就是說直接把數值存放到變量的存儲單元裏。spa

2)      對於引用類型的變量,賦值是把原對象的引用(能夠理解爲入口地址),存放在變量的存儲單元裏。對象

3.1 對象的賦值

簡單類型的賦值很容易理解,這裏僅討論對象的賦值。全部引用類型的實例就是咱們常說的對象。內存

能夠這樣說,除了null之外,任何變量的初始賦值都是分兩步:class

1)      建立對象實例變量

2)      把對象實例的引用賦值給變量。數據類型

 

好比:引用

       Object o1 = new Object();程序

3.2 傳遞

傳遞是經過變量之間的賦值實現的。在之前的回貼中我說過這樣一句話,單純從變量的角度看,變量之間的賦值是值傳遞。如今我解釋一下個人觀點。

 

先舉一個例子:

    // 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所引用的對象。

 

    變量賦值時會先把原先的值清除,而後再把新的值放入變量的地址中(基本數據類型)

相關文章
相關標籤/搜索