類
函數(shù)容器
我們看個(gè)例子次洼,Java API中的類Math,它里面主要就包含了若干數(shù)學(xué)函數(shù),下表列出了其中一些:
使用這些函數(shù)搓译,直接在前面加Math.即可,例如Math.abs(-1)返回1锋喜。
這些函數(shù)都有相同的修飾符些己,public static豌鸡。
static表示類方法,也叫靜態(tài)方法段标,與類方法相對(duì)的是實(shí)例方法涯冠。實(shí)例方法沒有static修飾符,必須通過實(shí)例或者叫對(duì)象(待會(huì)介紹)調(diào)用逼庞,而類方法可以直接通過類名進(jìn)行調(diào)用的蛇更,不需要?jiǎng)?chuàng)建實(shí)例。
public表示這些函數(shù)是公開的赛糟,可以在任何地方被外部調(diào)用派任。與public相對(duì)的有private,如果是private璧南,表示私有掌逛,這個(gè)函數(shù)只能在同一個(gè)類內(nèi)被別的函數(shù)調(diào)用,而不能被外部的類調(diào)用司倚。在Math類中豆混,有一個(gè)函數(shù) Random initRNG()就是private的,這個(gè)函數(shù)被public的方法random()調(diào)用以生成隨機(jī)數(shù)动知,但不能在Math類以外的地方被調(diào)用
將函數(shù)聲明為private可以避免該函數(shù)被外部類誤用皿伺,調(diào)用者可以清楚的知道哪些函數(shù)是可以調(diào)用的,哪些是不可以調(diào)用的拍柒。類實(shí)現(xiàn)者通過private函數(shù)封裝和隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié)心傀,而調(diào)用者只需要關(guān)心public的就可以了〔鹧叮可以說(shuō)脂男,通過private封裝和隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié),避免被誤操作种呐,是計(jì)算機(jī)程序的一種基本思維方式宰翅。
除了Math類,我們?cè)賮?lái)看一個(gè)例子Arrays爽室,Arrays里面包含很多與數(shù)組操作相關(guān)的函數(shù)汁讼,下表列出了其中一些:
這里將類看做函數(shù)的容器,更多的是從語(yǔ)言實(shí)現(xiàn)的角度看阔墩,從概念的角度看嘿架,Math和Arrays也可以看做是自定義數(shù)據(jù)類型,分別表示數(shù)學(xué)和數(shù)組類型啸箫,其中的public static函數(shù)可以看做是類型能進(jìn)行的操作耸彪。接下來(lái)讓我們更為詳細(xì)的討論自定義數(shù)據(jù)類型。
自定義數(shù)據(jù)類型
我們將類看做自定義數(shù)據(jù)類型忘苛,所謂自定義數(shù)據(jù)類型就是除了八種基本類型以外的其他類型蝉娜,用于表示和處理基本類型以外的其他數(shù)據(jù)唱较。
一個(gè)數(shù)據(jù)類型由其包含的屬性以及該類型可以進(jìn)行的操作組成,屬性又可以分為是類型本身具有的屬性召川,還是一個(gè)具體數(shù)據(jù)具有的屬性南缓,同樣,操作也可以分為是類型本身可以進(jìn)行的操作荧呐,還是一個(gè)具體數(shù)據(jù)可以進(jìn)行的操作汉形。
這樣,一個(gè)數(shù)據(jù)類型就主要由四部分組成:
類型本身具有的屬性坛增,通過類變量體現(xiàn)
類型本身可以進(jìn)行的操作获雕,通過類方法體現(xiàn)
類型實(shí)例具有的屬性薄腻,通過實(shí)例變量體現(xiàn)
類型實(shí)例可以進(jìn)行的操作收捣,通過實(shí)例方法體現(xiàn)
不過,對(duì)于一個(gè)具體類型庵楷,每一個(gè)部分不一定都有罢艾,Arrays類就只有類方法。
類變量和實(shí)例變量都叫成員變量尽纽,也就是類的成員咐蚯,類變量也叫靜態(tài)變量或靜態(tài)成員變量。類方法和實(shí)例方法都叫成員方法弄贿,也都是類的成員春锋,類方法也叫靜態(tài)方法。
類方法我們上面已經(jīng)看過了差凹,Math和Arrays類中定義的方法就是類方法期奔,這些方法的修飾符必須有static。下面解釋下類變量危尿,實(shí)例變量和實(shí)例方法呐萌。
類變量
類型本身具有的屬性通過類變量體現(xiàn),經(jīng)常用于表示一個(gè)類型中的常量谊娇,比如Math類肺孤,定義了兩個(gè)數(shù)學(xué)中常用的常量,如下所示:
E表示數(shù)學(xué)中自然對(duì)數(shù)的底數(shù)济欢,自然對(duì)數(shù)在很多學(xué)科中有重要的意義赠堵,PI表示數(shù)學(xué)中的圓周率π。與類方法一樣法褥,類變量可以直接通過類名訪問茫叭,如Math.PI。
這兩個(gè)變量的修飾符也都有public static挖胃,public表示外部可以訪問杂靶,static表示是類變量梆惯。與public相對(duì)的主要也是private,表示變量只能在類內(nèi)被訪問吗垮。與static相對(duì)的是實(shí)例變量垛吗,沒有static修飾符。
這里多了一個(gè)修飾符final烁登,final在修飾變量的時(shí)候表示常量怯屉,即變量賦值后就不能再修改了。使用final可以避免誤操作饵沧,比如說(shuō)锨络,如果有人不小心將Math.PI的值改了,那么很多相關(guān)的計(jì)算就會(huì)出錯(cuò)狼牺。另外羡儿,Java編譯器可以對(duì)final變量進(jìn)行一些特別的優(yōu)化。所以是钥,如果數(shù)據(jù)賦值后就不應(yīng)該再變了掠归,就加final修飾符吧。
表示類變量的時(shí)候悄泥,static修飾符是必需的虏冻,但public和final都不是必需的。
實(shí)例變量和實(shí)例方法
實(shí)例字面意思就是一個(gè)實(shí)際的例子弹囚,實(shí)例變量表示具體的實(shí)例所具有的屬性厨相,實(shí)例方法表示具體的實(shí)例可以進(jìn)行的操作。如果將微信訂閱號(hào)看做一個(gè)類型鸥鹉,那"老馬說(shuō)編程"訂閱號(hào)就是一個(gè)實(shí)例蛮穿,訂閱號(hào)的頭像、功能介紹宋舷、發(fā)布的文章可以看做實(shí)例變量绪撵,而修改頭像、修改功能介紹祝蝠、發(fā)布新文章可以看做實(shí)例方法音诈。與基本類型對(duì)比,int a;這個(gè)語(yǔ)句绎狭,int就是類型细溅,而a就是實(shí)例。
接下來(lái)儡嘶,我們通過定義和使用類喇聊,來(lái)進(jìn)一步理解自定義數(shù)據(jù)類型。
定義第一個(gè)類
我們定義一個(gè)簡(jiǎn)單的類蹦狂,表示在平面坐標(biāo)軸中的一個(gè)點(diǎn)誓篱,代碼如下:
我們來(lái)解釋一下:
public class Point
表示類型的名字是Point朋贬,是可以被外部公開訪問的。這個(gè)public修飾似乎是多余的窜骄,不能被外部訪問還能有什么用锦募?在這里,確實(shí)不能用private修飾Point邻遏。但修飾符可以沒有(即留空)糠亩,表示一種包級(jí)別的可見性,我們后續(xù)章節(jié)介紹准验,另外赎线,類可以定義在一個(gè)類的內(nèi)部,這時(shí)可以使用private修飾符糊饱,我們也在后續(xù)章節(jié)介紹垂寥。
public int x;
public int y;
定義了兩個(gè)實(shí)例變量,x和y济似,分別表示x坐標(biāo)和y坐標(biāo)矫废,與類變量類似,修飾符也有public或private修飾符砰蠢,表示含義類似,public表示可被外部訪問唉铜,而private表示私有台舱,不能直接被外部訪問,實(shí)例變量不能有static修飾符潭流。
public double distance(){
return Math.sqrt(xx+yy);
}
定義了實(shí)例方法distance竞惋,表示該點(diǎn)到坐標(biāo)原點(diǎn)的距離。該方法可以直接訪問實(shí)例變量x和y灰嫉,這是實(shí)例方法和類方法的最大區(qū)別拆宛,實(shí)例方法和類方法都可以有參數(shù)、操作讼撒、返回值浑厚,但類方法只能操作參數(shù)和方法內(nèi)定義的變量,而實(shí)例方法可以直接操作實(shí)例變量根盒,可以讀也可以改钳幅。
實(shí)例方法直接訪問實(shí)例變量,到底是什么意思呢炎滞?其實(shí)敢艰,在實(shí)例方法中,有一個(gè)隱含的參數(shù)册赛,這個(gè)參數(shù)就是當(dāng)前操作的實(shí)例自己钠导,直接操作實(shí)例變量震嫉,實(shí)際也需要通過參數(shù)進(jìn)行。后續(xù)我們還會(huì)進(jìn)一步解釋牡属。
使用第一個(gè)類
定義了類本身和定義了一個(gè)函數(shù)類似责掏,本身不會(huì)做什么事情,不會(huì)分配內(nèi)存湃望,也不會(huì)執(zhí)行代碼换衬。方法要執(zhí)行需要被調(diào)用,而實(shí)例方法被調(diào)用证芭,首先需要一個(gè)實(shí)例瞳浦,實(shí)例也稱為對(duì)象,我們可能會(huì)交替使用废士。下面的代碼演示了如何使用:
我們解釋一下:
Point p = new Point();
這個(gè)語(yǔ)句包含了Point類型的變量聲明和賦值叫潦,它可以分為兩部分:
Point p;
p = new Point();
Point p聲明了一個(gè)變量官硝,這個(gè)變量叫p矗蕊,是Point類型的。這個(gè)變量和數(shù)組變量是類似的氢架,都有兩塊內(nèi)存傻咖,一塊存放實(shí)際內(nèi)容,一塊存放實(shí)際內(nèi)容的位置岖研。聲明變量本身只會(huì)分配存放位置的內(nèi)存空間卿操,這塊空間還沒有指向任何實(shí)際內(nèi)容。因?yàn)檫@種變量和數(shù)組變量本身不存儲(chǔ)數(shù)據(jù)孙援,而只是存儲(chǔ)實(shí)際內(nèi)容的位置害淤,它們也都稱為引用類型的變量。
p = new Point();創(chuàng)建了一個(gè)實(shí)例或?qū)ο笸厥郏缓筚x值給了Point類型的變量p窥摄,它至少做了兩件事:
分配內(nèi)存,以存儲(chǔ)新對(duì)象的數(shù)據(jù)础淤,對(duì)象數(shù)據(jù)包括這個(gè)對(duì)象的屬性崭放,具體包括其實(shí)例變量x和y。
給實(shí)例變量設(shè)置默認(rèn)值值骇,int類型默認(rèn)值為0莹菱。
與方法內(nèi)定義的局部變量不同,在創(chuàng)建對(duì)象的時(shí)候吱瘩,所有的實(shí)例變量都會(huì)分配一個(gè)默認(rèn)值道伟,這與在創(chuàng)建數(shù)組的時(shí)候是類似的,數(shù)值類型變量的默認(rèn)值是0,boolean是false, char是'\u0000'蜜徽,引用類型變量都是null祝懂,null是一個(gè)特殊的值,表示不指向任何對(duì)象拘鞋。這些默認(rèn)值可以修改砚蓬,我們待會(huì)介紹。
p.x = 2;
p.y = 3;
給對(duì)象的變量賦值盆色,語(yǔ)法形式是:對(duì)象變量名.成員名灰蛙。
System.out.println(p.distance());
調(diào)用實(shí)例方法distance,并輸出結(jié)果隔躲,語(yǔ)法形式是:對(duì)象變量名.方法名摩梧。實(shí)例方法內(nèi)對(duì)實(shí)例變量的操作,實(shí)際操作的就是p這個(gè)對(duì)象的數(shù)據(jù)宣旱。
我們?cè)诮榻B基本類型的時(shí)候仅父,是先定義數(shù)據(jù),然后賦值浑吟,最后是操作笙纤,自定義類型與此類似:
Point p = new Point(); 是定義數(shù)據(jù)并設(shè)置默認(rèn)值
p.x = 2; p.y = 3; 是賦值
p.distance() 是數(shù)據(jù)的操作
可以看出,對(duì)實(shí)例變量和實(shí)例方法的訪問都通過對(duì)象進(jìn)行组力,通過對(duì)象來(lái)訪問和操作其內(nèi)部的數(shù)據(jù)是一種基本的面向?qū)ο笏季S省容。本例中,我們通過對(duì)象直接操作了其內(nèi)部數(shù)據(jù)x和y忿项,這是一個(gè)不好的習(xí)慣蓉冈,一般而言,不應(yīng)該將實(shí)例變量聲明為public轩触,而只應(yīng)該通過對(duì)象的方法對(duì)實(shí)例變量進(jìn)行操作,原因也是為了減少誤操作家夺,直接訪問變量沒有辦法進(jìn)行參數(shù)檢查和控制脱柱,而通過方法修改,可以在方法中進(jìn)行檢查拉馋。
修改變量默認(rèn)值
之前我們說(shuō)榨为,實(shí)例變量都有一個(gè)默認(rèn)值,如果希望修改這個(gè)默認(rèn)值煌茴,可以在定義變量的同時(shí)就賦值随闺,或者將代碼放入初始化代碼塊中,代碼塊用{}包圍蔓腐,如下面代碼所示:
private int x = 1;
private int y;
{
y = 2;
}
x的默認(rèn)值設(shè)為了1矩乐,y的默認(rèn)值設(shè)為了2。在新建一個(gè)對(duì)象的時(shí)候,會(huì)先調(diào)用這個(gè)初始化散罕,然后才會(huì)執(zhí)行構(gòu)造方法中的代碼分歇。
靜態(tài)變量也可以這樣初始化:
static private int STATIC_ONE = 1;
static private int STATIC_TWO;{
STATIC_TWO = 2;
}
修改類 - 實(shí)例變量改為private
上面我們說(shuō)一般不應(yīng)該將實(shí)例變量聲明為public,下面我們修改一下類的定義欧漱,將實(shí)例變量定義為private职抡,通過實(shí)例方法來(lái)操作變量,代碼如下:
這個(gè)定義中误甚,我們加了四個(gè)方法缚甩,setX/setY用于設(shè)置實(shí)例變量的值,getX/getY用于獲取實(shí)例變量的值窑邦。
這里面需要介紹的是this這個(gè)關(guān)鍵字擅威,this表示當(dāng)前實(shí)例,在語(yǔ)句this.x=x;中奕翔,this.x表示實(shí)例變量x裕寨,而右邊的x表示方法參數(shù)中的x。前面我們提到派继,在實(shí)例方法中宾袜,有一個(gè)隱含的參數(shù),這個(gè)參數(shù)就是this驾窟,沒有歧義的情況下庆猫,可以直接訪問實(shí)例變量,在這個(gè)例子中绅络,兩個(gè)變量名都叫x月培,則需要通過加上this來(lái)消除歧義。
這四個(gè)方法看上去是非常多余的恩急,直接訪問變量不是更簡(jiǎn)潔嗎杉畜?而且上節(jié)我們也說(shuō)過,函數(shù)調(diào)用是有成本的衷恭。在這個(gè)例子中此叠,意義確實(shí)不太大,實(shí)際上随珠,Java編譯器一般也會(huì)將對(duì)這幾個(gè)方法的調(diào)用轉(zhuǎn)換為直接訪問實(shí)例變量灭袁,而避免函數(shù)調(diào)用的開銷。但在很多情況下窗看,通過函數(shù)調(diào)用可以封裝內(nèi)部數(shù)據(jù)茸歧,避免誤操作,我們一般還是不將成員變量定義為public显沈。
使用這個(gè)類的代碼如下:
將對(duì)實(shí)例變量的直接訪問改為了方法調(diào)用软瞎。
修改類 - 引入構(gòu)造方法
在初始化對(duì)象的時(shí)候,前面我們都是直接對(duì)每個(gè)變量賦值,有一個(gè)更簡(jiǎn)單的方式對(duì)實(shí)例變量賦初值铜涉,就是構(gòu)造方法智玻,我們先看下代碼,在Point類定義中增加如下代碼:
這兩個(gè)就是構(gòu)造方法芙代,構(gòu)造方法可以有多個(gè)吊奢。不同于一般方法,構(gòu)造方法有一些特殊的地方:
名稱是固定的纹烹,與類名相同页滚。這也容易理解,靠這個(gè)用戶和Java系統(tǒng)就都能容易的知道哪些是構(gòu)造方法铺呵。
沒有返回值裹驰,也不能有返回值。這個(gè)規(guī)定大概是因?yàn)榉祷刂禌]用吧片挂。
與普通方法一樣幻林,構(gòu)造方法也可以重載。第二個(gè)構(gòu)造方法是比較容易理解的音念,使用this對(duì)實(shí)例變量賦值沪饺。
我們解釋下第一個(gè)構(gòu)造方法,this(0,0)的意思是調(diào)用第二個(gè)構(gòu)造方法闷愤,并傳遞參數(shù)0,0整葡,我們前面解釋說(shuō)this表示當(dāng)前實(shí)例,可以通過this訪問實(shí)例變量讥脐,這是this的第二個(gè)用法遭居,用于在構(gòu)造方法中調(diào)用其他構(gòu)造方法。
這個(gè)this調(diào)用必須放在第一行旬渠,這個(gè)規(guī)定應(yīng)該也是為了避免誤操作俱萍,構(gòu)造方法是用于初始化對(duì)象的,如果要調(diào)用別的構(gòu)造方法告丢,先調(diào)別的鼠次,然后根據(jù)情況自己再做調(diào)整,而如果自己先初始化了一部分芋齿,再調(diào)別的,自己的修改可能就被覆蓋了成翩。
這個(gè)例子中觅捆,不帶參數(shù)的構(gòu)造方法通過this(0,0)又調(diào)用了第二個(gè)構(gòu)造方法,這個(gè)調(diào)用是多余的麻敌,因?yàn)閤和y的默認(rèn)值就是0栅炒,不需要再單獨(dú)賦值,我們這里主要是演示其語(yǔ)法。
我們來(lái)看下如何使用構(gòu)造方法赢赊,代碼如下:
Point p = new Point(2,3);
這個(gè)調(diào)用就可以將實(shí)例變量x和y的值設(shè)為2和3乙漓。前面我們介紹 new Point()的時(shí)候說(shuō),它至少做了兩件事释移,一個(gè)是分配內(nèi)存叭披,另一個(gè)是給實(shí)例變量設(shè)置默認(rèn)值,這里我們需要加上一件事玩讳,就是調(diào)用構(gòu)造方法涩蜘。調(diào)用構(gòu)造方法是new操作的一部分。
通過構(gòu)造方法熏纯,可以更為簡(jiǎn)潔的對(duì)實(shí)例變量進(jìn)行賦值同诫。
默認(rèn)構(gòu)造方法
每個(gè)類都至少要有一個(gè)構(gòu)造方法,在通過new創(chuàng)建對(duì)象的過程中會(huì)被調(diào)用樟澜。但構(gòu)造方法如果沒什么操作要做误窖,可以省略。Java編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)構(gòu)造方法秩贰,也沒有具體操作霹俺。但一旦定義了構(gòu)造方法,Java就不會(huì)再自動(dòng)生成默認(rèn)的萍膛,具體什么意思呢吭服?在這個(gè)例子中,如果我們只定義了第二個(gè)構(gòu)造方法(帶參數(shù)的)蝗罗,則下面語(yǔ)句:
Point p = new Point();
就會(huì)報(bào)錯(cuò)艇棕,因?yàn)檎也坏讲粠?shù)的構(gòu)造方法。
為什么Java有時(shí)候幫助自動(dòng)生成串塑,有時(shí)候不生成呢沼琉?你在沒有定義任何構(gòu)造方法的時(shí)候,Java認(rèn)為你不需要桩匪,所以就生成一個(gè)空的以被new過程調(diào)用打瘪,你定義了構(gòu)造方法的時(shí)候,Java認(rèn)為你知道自己在干什么傻昙,認(rèn)為你是有意不想要不帶參數(shù)的構(gòu)造方法的闺骚,所以不會(huì)幫你生成。
私有構(gòu)造方法
構(gòu)造方法可以是私有方法妆档,即修飾符可以為private僻爽, 為什么需要私有構(gòu)造方法呢?大概可能有這么幾種場(chǎng)景:
不能創(chuàng)建類的實(shí)例贾惦,類只能被靜態(tài)訪問胸梆,如Math和Arrays類敦捧,它們的構(gòu)造方法就是私有的。
能創(chuàng)建類的實(shí)例碰镜,但只能被類的的靜態(tài)方法調(diào)用兢卵。有一種常用的場(chǎng)景,即類的對(duì)象有但是只能有一個(gè)绪颖,即單例模式(后續(xù)文章介紹)秽荤,在這個(gè)場(chǎng)景中,對(duì)象是通過靜態(tài)方法獲取的菠发,而靜態(tài)方法調(diào)用私有構(gòu)造方法創(chuàng)建一個(gè)對(duì)象王滤,如果對(duì)象已經(jīng)創(chuàng)建過了,就重用這個(gè)對(duì)象滓鸠。
只是用來(lái)被其他多個(gè)構(gòu)造方法調(diào)用雁乡,用于減少重復(fù)代碼。
關(guān)鍵字小結(jié)
本節(jié)我們提到了多個(gè)關(guān)鍵字糜俗,這里匯總一下:
public:可以修飾類踱稍、類方法、類變量悠抹、實(shí)例變量珠月、實(shí)例方法、構(gòu)造方法楔敌,表示可被外部訪問啤挎。
private:可以修飾類、類方法卵凑、類變量庆聘、實(shí)例變量、實(shí)例方法勺卢、構(gòu)造方法伙判,表示不可以被外部訪問,只能在類內(nèi)被使用黑忱。
static: 修飾類變量和類方法宴抚,它也可以修飾內(nèi)部類(后續(xù)章節(jié)介紹)。
this:表示當(dāng)前實(shí)例甫煞,可以用于調(diào)用其他構(gòu)造方法菇曲,訪問實(shí)例變量,訪問實(shí)例方法抚吠。
final: 修飾類變量羊娃、實(shí)例變量,表示只能被賦值一次埃跷,final也可以修飾實(shí)例方法(后續(xù)章節(jié)介紹)蕊玷。
類和對(duì)象的生命周期
類
在程序運(yùn)行的時(shí)候,當(dāng)?shù)谝淮瓮ㄟ^new創(chuàng)建一個(gè)類的對(duì)象的時(shí)候弥雹,或者直接通過類名訪問類變量和類方法的時(shí)候垃帅,Java會(huì)將類加載進(jìn)內(nèi)存,為這個(gè)類型分配一塊空間剪勿,這個(gè)空間會(huì)包括類的定義贸诚,它有哪些變量,哪些方法等厕吉,同時(shí)還有類的靜態(tài)變量酱固,并對(duì)靜態(tài)變量賦初始值。
類加載進(jìn)內(nèi)存后头朱,一般不會(huì)釋放运悲,直到程序結(jié)束。一般情況下项钮,類只會(huì)加載一次班眯,所以靜態(tài)變量在內(nèi)存中只有一份。
對(duì)象
當(dāng)通過new創(chuàng)建一個(gè)對(duì)象的時(shí)候烁巫,對(duì)象產(chǎn)生署隘,在內(nèi)存中,會(huì)存儲(chǔ)這個(gè)對(duì)象的實(shí)例變量值亚隙,每new一次磁餐,對(duì)象就會(huì)產(chǎn)生一個(gè),就會(huì)有一份獨(dú)立的實(shí)例變量阿弃。
每個(gè)對(duì)象除了保存實(shí)例變量的值外诊霹,可以理解還保存著對(duì)應(yīng)類型即類的地址,這樣恤浪,通過對(duì)象能知道它的類畅哑,訪問到類的變量和方法代碼。
實(shí)例方法可以理解為一個(gè)靜態(tài)方法水由,只是多了一個(gè)參數(shù)this荠呐,通過對(duì)象調(diào)用方法,可以理解為就是調(diào)用這個(gè)靜態(tài)方法砂客,并將對(duì)象作為參數(shù)傳給this泥张。
對(duì)象的釋放是被Java用垃圾回收機(jī)制管理的,大部分情況下鞠值,我們不用太操心媚创,當(dāng)對(duì)象不再被使用的時(shí)候會(huì)被自動(dòng)釋放。
具體來(lái)說(shuō)彤恶,對(duì)象和數(shù)組一樣钞钙,有兩塊內(nèi)存鳄橘,保存地址的部分分配在棧中,而保存實(shí)際內(nèi)容的部分分配在堆中芒炼。棧中的內(nèi)存是自動(dòng)管理的瘫怜,函數(shù)調(diào)用入棧就會(huì)分配,而出棧就會(huì)釋放本刽。
堆中的內(nèi)存是被垃圾回收機(jī)制管理的鲸湃,當(dāng)沒有活躍變量指向?qū)ο蟮臅r(shí)候,對(duì)應(yīng)的堆空間就可能被釋放子寓,具體釋放時(shí)間是Java虛擬機(jī)自己決定的暗挑。活躍變量斜友,具體的說(shuō)炸裆,就是已加載的類的類變量,和棧中所有的變量蝙寨。
寫在最后
都看到這里晒衩,保存思維導(dǎo)圖,順便給個(gè)贊唄墙歪!