前面已經複習了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
。這個過程都是在棧中執行的,跟引用不一樣,引用的是一個地址的資訊,引用操作的是堆中的對象。