《Java編程的邏輯》筆記12--類

類.png

函數(shù)容器

我們看個(gè)例子次洼,Java API中的類Math,它里面主要就包含了若干數(shù)學(xué)函數(shù),下表列出了其中一些:

image

使用這些函數(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ù)汁讼,下表列出了其中一些:

image

這里將類看做函數(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é)中常用的常量,如下所示:

image

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)誓篱,代碼如下:

image

我們來(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ì)交替使用废士。下面的代碼演示了如何使用:

image

我們解釋一下:

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窥摄,它至少做了兩件事:

  1. 分配內(nèi)存,以存儲(chǔ)新對(duì)象的數(shù)據(jù)础淤,對(duì)象數(shù)據(jù)包括這個(gè)對(duì)象的屬性崭放,具體包括其實(shí)例變量x和y。

  2. 給實(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)操作變量,代碼如下:

image

這個(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è)類的代碼如下:

image

將對(duì)實(shí)例變量的直接訪問改為了方法調(diào)用软瞎。

修改類 - 引入構(gòu)造方法

在初始化對(duì)象的時(shí)候,前面我們都是直接對(duì)每個(gè)變量賦值,有一個(gè)更簡(jiǎn)單的方式對(duì)實(shí)例變量賦初值铜涉,就是構(gòu)造方法智玻,我們先看下代碼,在Point類定義中增加如下代碼:

image

這兩個(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è)贊唄墙歪!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末听系,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虹菲,更是在濱河造成了極大的恐慌靠胜,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毕源,死亡現(xiàn)場(chǎng)離奇詭異浪漠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霎褐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門址愿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人冻璃,你說(shuō)我怎么就攤上這事响谓。” “怎么了省艳?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵娘纷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我跋炕,道長(zhǎng)赖晶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任辐烂,我火速辦了婚禮遏插,結(jié)果婚禮上捂贿,老公的妹妹穿的比我還像新娘。我一直安慰自己涩堤,他們只是感情好眷蜓,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胎围,像睡著了一般。 火紅的嫁衣襯著肌膚如雪德召。 梳的紋絲不亂的頭發(fā)上白魂,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音上岗,去河邊找鬼福荸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肴掷,可吹牛的內(nèi)容都是我干的敬锐。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼呆瞻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼台夺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起痴脾,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颤介,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赞赖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滚朵,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年骆姐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兵拢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欢伏。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖移宅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情年堆,我是刑警寧澤吞杭,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站变丧,受9級(jí)特大地震影響芽狗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痒蓬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一童擎、第九天 我趴在偏房一處隱蔽的房頂上張望滴劲。 院中可真熱鬧,春花似錦顾复、人聲如沸班挖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)萧芙。三九已至,卻和暖如春假丧,著一層夾襖步出監(jiān)牢的瞬間双揪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工包帚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渔期,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓渴邦,卻偏偏與公主長(zhǎng)得像疯趟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谋梭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用信峻。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,599評(píng)論 1 114
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,823評(píng)論 1 10
  • 第一章 推薦bgm:分享Revo & 梶浦由記的單曲《sand dream》:http://music.163.c...
    昀里霧里閱讀 226評(píng)論 0 1
  • 今年的天氣格外任性,昨日還在談?wù)撔驴畲貉b如何章蚣,今天就翻出不知放到柜子里幾次的大棉襖來(lái)穿了站欺!盡管如此,仍然擋不住運(yùn)動(dòng)...
    莊姜夫人閱讀 414評(píng)論 0 7
  • 我們匯聚了共建“一帶一路”的更大合力纤垂。首屆“一帶一路”國(guó)際合作高峰論壇成功舉行矾策,達(dá)成270多項(xiàng)合作成果,推動(dòng)一批重...
    依然如水閱讀 189評(píng)論 0 0