在方法體內(nèi)定義的(局部變量)一些基本類(lèi)型的變量和對(duì)象的引用變量都是在方法的棧內(nèi)存中分配的膊爪。當(dāng)在一段方法塊中定義一個(gè)變量時(shí),Java 就會(huì)在棧中為該變量分配內(nèi)存空間窖式,當(dāng)超過(guò)該變量的作用域后蚁飒,該變量也就無(wú)效了,分配給它的內(nèi)存空間也將被釋放掉萝喘,該內(nèi)存空間可以被重新使用淮逻。
堆內(nèi)存用來(lái)存放所有由 new 創(chuàng)建的對(duì)象(包括該對(duì)象其中的所有成員變量)和數(shù)組。在堆中分配的內(nèi)存阁簸,將由 Java 垃圾回收器來(lái)自動(dòng)管理爬早。在堆中產(chǎn)生了一個(gè)數(shù)組或者對(duì)象后,還可以在棧中定義一個(gè)特殊的變量启妹,這個(gè)變量的取值等于數(shù)組或者對(duì)象在堆內(nèi)存中的首地址筛严,這個(gè)特殊的變量就是我們上面說(shuō)的引用變量。我們可以通過(guò)這個(gè)引用變量來(lái)訪問(wèn)堆中的對(duì)象或者數(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 類(lèi)的局部變量 s2 和引用變量 mSample2 都是存在于棧中桨啃,但 mSample2 指向的對(duì)象是存在于堆上的。 mSample3 指向的對(duì)象實(shí)體存放在堆上檬输,包括這個(gè)對(duì)象的所有成員變量 s1 和 mSample1照瘾,而它自己存在于棧中。
結(jié)論:
局部變量的基本數(shù)據(jù)類(lèi)型和引用存儲(chǔ)于棧中丧慈,引用的對(duì)象實(shí)體存儲(chǔ)于堆中析命。—— 因?yàn)樗鼈儗儆诜椒ㄖ械淖兞刻幽芷陔S方法而結(jié)束鹃愤。
成員變量全部存儲(chǔ)與堆中(包括基本數(shù)據(jù)類(lèi)型,引用和引用的對(duì)象實(shí)體)—— 因?yàn)樗鼈儗儆陬?lèi)完域,類(lèi)對(duì)象終究是要被new出來(lái)使用的软吐。
引用于--棧與堆的區(qū)別