作者:禪樓望月(http://m.survivalescaperooms.com/yaoyinglong/) 靜態的java數組
Java語言是典型的靜態語言,因而,數組也是靜態的,即當該數組被初始化之后,該數組的長度是不可變的。
java 語言的數組變量是引用類型,什么意思呢?意思就是,數組變量并不是數組本身,它只是指向堆內存中的數組對象。如:
這3個變量以及各自引用的數組在內存中的分配如圖:
我們平時可以通過改變數組變量的指向,讓它指向的堆內存中的其他數組對象(前提是他們的編譯類型是兼容的),從表面上看起來好像是更改了數組的長度。但是其實我們只是讓該數組變量指向了另一個數組對象,而原來的那個數組對象再沒有其他數組變量指向的情況下等待垃圾回收。
對數組變量來說,它并不需要進行所謂的初始化,只是讓數組變量指向一個有效的數組對象即可。
對Java程序來說,所有的引用類型的變量都不需要經過所謂的初始化,需要進行初始化的只是該引用變量所引用的對象。
所有的局部變量都是存放在棧內存中,不管其是引用類型的變量還是基本類型的變量,都是存儲在各自的方法棧區中;但引用類型變量所引用的對象(包括數組、普通的Java對象)則總是存儲在堆內存中。
對于Java,堆內存中的對象(不管是數組還是普通Java對象)通常不允許直接訪問,為了訪問堆內存中的對象,通常只能通過引用變量。
數組變量都是存儲在棧內存中的,但數組元素則作為數組對象的一部分被保存在堆內存中,無論它們是基本類型的數組元素還是引用類型的數組元素。 基本類型數組的初始化
對于基本類型數組而言,數組元素的值直接存儲在對應的數組元素中,因此程序直接為數組分配內存空間,再將數組元素的值存入對應的內存里即可。
intArr只是一個數組變量,它存在它所在的方法棧區中,它實際指向對內存中的一個數組對象。所以應該將數組變量與數組對象分開。 引用類型數組的初始化
比基本類型數組初始化復雜了一點:引用類型數組元素里面存還是引用,而不是引用對象本身,它指向堆內存中另一塊內存單元(這塊內存中存儲了引用變量所指向的對象:數組或者Java對象)。
public class Person { PRivate String name; private int age; public Person(String name,int age) { this.name=name; this.age=age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString(){ return "我叫"+name+" 我的年齡是:"+age; } public static void main(String[] args) { Person[] students=new Person[3]; Person xiaoming=new Person("小明", 10); Person xiaohong=new Person("小紅", 15); Person xiaozhang=new Person("小張", 20); students[0]=xiaoming; students[1]=xiaohong; students[2]=xiaozhang; System.out.println(Arrays.toString(students)); System.out.println("xiaoming和students[0]是不是指向同一個Java對象?-->"+(xiaoming==students[0])); xiaohong.setName("我的名字改了"); System.out.println("通過變量xiaoming修改了它指向的Java對象的name屬性:"+xiaohong.getName()); System.out.print("獲取students[1]的name屬性為:"); System.out.println(students[1].getName()); }}打印出的結果為:
main函數執行過程的內存示意:

新聞熱點
疑難解答