在方法體內(nèi)定義的(局部變量)一些基本類型的變量和對象的引用變量都是在方法的棧內(nèi)存中分配的。當(dāng)在一段方法塊中定義一個(gè)變量時(shí),Java 就會(huì)在棧中為該變量分配內(nèi)存空間,當(dāng)超過該變量的作用域后,該變量也就無效了,分配給它的內(nèi)存空間也將被釋放掉,該內(nèi)存空間可以被重新使用。
堆內(nèi)存用來存放所有由 new 創(chuàng)建的對象(包括該對象其中的所有成員變量)和數(shù)組。在堆中分配的內(nèi)存,將由 Java 垃圾回收器來自動(dòng)管理。在堆中產(chǎn)生了一個(gè)數(shù)組或者對象后,還可以在棧中定義一個(gè)特殊的變量,這個(gè)變量的取值等于數(shù)組或者對象在堆內(nèi)存中的首地址,這個(gè)特殊的變量就是我們上面說的引用變量。我們可以通過這個(gè)引用變量來訪問堆中的對象或者數(shù)組。
舉個(gè)例子:
public class Sample {
int s1 = 0;
Sample mSample1 = new Sample();
public void method() {
int s2 = 1;
Sample mSample2 = new Sample();
}
}
Sample mSample3 = new Sample();
Sample 類的局部變量 s2 和引用變量 mSample2 都是存在于棧中,但 mSample2 指向的對象是存在于堆上的。 mSample3 指向的對象實(shí)體存放在堆上,包括這個(gè)對象的所有成員變量 s1 和 mSample1,而它自己存在于棧中。
結(jié)論:
局部變量的基本數(shù)據(jù)類型和引用存儲(chǔ)于棧中,引用的對象實(shí)體存儲(chǔ)于堆中。—— 因?yàn)樗鼈儗儆诜椒ㄖ械淖兞浚芷陔S方法而結(jié)束。
成員變量全部存儲(chǔ)與堆中(包括基本數(shù)據(jù)類型,引用和引用的對象實(shí)體)—— 因?yàn)樗鼈儗儆陬悾悓ο蠼K究是要被new出來使用的。
引用于--棧與堆的區(qū)別