java基礎–參考型別

來源:互聯網
上載者:User

       前面已經複習了java的8個原生資料類型,其實我們在開發中還會使用到一個重要的參考型別。

       參考型別是用在對象上的。一個對象可以被多個引用所指向,同一時刻每個引用只能指向唯一的一個對象。如,

   

     在棧中,有4個引用分別為people1,people2,people3,people4指向同一個對象People對象。如果一個對象被多個引用指向的話,那麼無論哪個引用對對象的屬性的修改,都會反映到其他的引用當中。例:

public class People {    // 對象的屬性    int age = 20;        // 改變對象的屬性    public void change(People people) {        people.age = 30;    }            public static void main(String[] args) {        // 一個People類型的引用,指向一個People對象        People people = new People();                people.change(people);                System.out.println(people.age); //30                // people2也指向People對象        People people2 = people;                System.out.println(people2.age); //30    }}

     如上的例子,其堆棧分析如下:


                 

        (紅色部分表示被清空)people指向People對象,首先將age改為30,現在People對象中的age為30,所以people的age為30;people2指向People對象,所以people2的age值也為30。再看如下代碼:

public class People {    // 對象的屬性    int age = 20;        // 改變對象的屬性    public void change(People people2) {        // people指向新的對象        people2 = new People();                people2.age = 30;                System.out.println(people2.age); //30    }            public static void main(String[] args) {        // 一個People類型的引用,指向一個People對象        People people = new People();                people.change(people);                System.out.println(people.age); //20                // people3也指向People對象        People people3 = people;                System.out.println(people3.age); //20    }}

       如上的例子,其堆棧分析如下:

    

       (紅色部分表示被清空)在change()方法中,people2指向了新的對象,所以其改變新對象的age屬性值為30,但是people指向的是另外一個People對象,在該程式中沒有引用修改該對象age屬性的值,所以people的age屬性值依舊是20;正如代碼所示,people3指向了people所指向的對象,所以people3的age屬性值也為20。

      如果是以下代碼,結果又是如何?

public class DataTest {        public static void change(int a) {                a = 4;                System.out.println(a); //4    }        public static void main(String[] args) {        // 棧中建立一個變數a,開闢一個字面值為1,a指向它        int a = 1;                DataTest.change(a);                System.out.println(a); //1            }}

        如上,執行change()方法的時候,其實是將字面值1本身傳給了方法中的a,change()方法就是修改的字面值本身,跟main()方法中的a沒有任何關係了。等change()方法執行完畢,整個壓棧(方法調用)過程就結束了,繼續執行下面的程式,main()的a的值還是1
。這個過程都是在棧中執行的,跟引用不一樣,引用的是一個地址的資訊,引用操作的是堆中的對象。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.