五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Java零基礎(chǔ)快速入門|對(duì)象的創(chuàng)建和使用(上)

2021-02-04 15:34 作者:動(dòng)力節(jié)點(diǎn)小王本王  | 我要投稿



本篇文章主要內(nèi)容:

對(duì)象的創(chuàng)建和使用

Java虛擬機(jī)內(nèi)存管理

學(xué)習(xí)目標(biāo)

理解構(gòu)造方法以及重載機(jī)制,通過構(gòu)造方法可以完成對(duì)象的創(chuàng)建,并且能夠通過引用訪問對(duì)象的內(nèi)存,了解 Java 虛擬機(jī)內(nèi)存管理,能夠畫出程序執(zhí)行過程的內(nèi)存圖,并了解空指針異常是如何發(fā)生的,以及方法調(diào)用時(shí)參數(shù)是如何傳遞的。

?

知識(shí)框架


對(duì)象的創(chuàng)建和使用

對(duì)象的創(chuàng)建

類定義之后,就可以使用類這個(gè)“模板”來創(chuàng)造“對(duì)象”了,一個(gè)類是可以創(chuàng)建多個(gè)對(duì)象的哦!怎么創(chuàng)建呢,語法是什么?其實(shí)語法格式很簡(jiǎn)單:new 類名(),這樣就可以完成對(duì)象的創(chuàng)建了。俗話說,你想要什么java 都可以給你,想要啥你就new 啥。請(qǐng)看下面代碼:

為了使用對(duì)象更加方便,建議使用變量接收一下?例如以下代碼:

以上代碼最初接觸的時(shí)候,大家肯定會(huì)感覺非常陌生,這也是正常的,Student?s1?= new Student()實(shí)際上和int i?= 10 是類似的,對(duì)于 int i?= 10 來說,int 是一種基本數(shù)據(jù)類型,i 是變量名,10 int 類型的字面量。那對(duì)于 Student s1?= new Student()來說,其中Student 是一種引用數(shù)據(jù)類型,s1 是變量名,new Student()執(zhí)行之后是一個(gè)Student 類型的對(duì)象。

大家要注意了,java 語言當(dāng)中凡是使用 class 關(guān)鍵字定義的類都屬于引用數(shù)據(jù)類型,類名本身就是這種引用數(shù)據(jù)類型的類型名。

對(duì)象的使用

創(chuàng)建了對(duì)象之后怎么去訪問這個(gè)對(duì)象的屬性呢,或者說學(xué)生對(duì)象現(xiàn)在有了,怎么去訪問他的學(xué)號(hào)、姓名、性別、年齡等信息呢。請(qǐng)看以下代碼:

運(yùn)行結(jié)果如下圖所示:

對(duì)象的創(chuàng)建和使用


接下來解釋一下以上的輸出結(jié)果,通過以上的 Student 類可以創(chuàng)建很多學(xué)生對(duì)象,假設(shè)通Student 類實(shí)例化了兩個(gè)學(xué)生對(duì)象,那必然會(huì)有兩個(gè)不同的學(xué)號(hào),以上程序中并沒有給學(xué)號(hào)賦值,但是獲取了到的學(xué)號(hào)都是0,這是怎么回事呢?

這是因?yàn)樵?/span>java 語言當(dāng)中,當(dāng)實(shí)例變量沒有手動(dòng)賦值,在創(chuàng)建對(duì)象的時(shí)候,也就是說在 new?的時(shí)候,系統(tǒng)會(huì)對(duì)實(shí)例變量默認(rèn)賦值, 它們的默認(rèn)值請(qǐng)參考下表:


對(duì)象創(chuàng)建和使用的深層次解密

?java?虛擬機(jī)內(nèi)存管理

為了更好的理解上面的程序,先來看看java 虛擬機(jī)是如何管理它的內(nèi)存的,請(qǐng)看下圖:

java 虛擬機(jī)內(nèi)存管理


① 程序計(jì)數(shù)器:

1)?概念:可以看做當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。

2)?特點(diǎn):線程私有的內(nèi)存

java 虛擬機(jī)棧(重點(diǎn)):

1)?概念:描述的是 java?方法執(zhí)行的內(nèi)存模型。每個(gè)方法在執(zhí)行的時(shí)候會(huì)創(chuàng)建一個(gè)棧幀,用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。每個(gè)方法從調(diào)用直至完成的過程,就對(duì)應(yīng)一個(gè)棧幀從入棧到出棧的過程。

2)?特點(diǎn): 線程私有, 生命周期和線程相同。 這個(gè)區(qū)域會(huì)出現(xiàn)兩種異常: StackOverflowError?異常: 若線程請(qǐng)求的深度大于虛擬機(jī)所允許的深度。OutOfMemoryError?異常:若虛擬機(jī)可以動(dòng)態(tài)擴(kuò)展,如果擴(kuò)展是無法申請(qǐng)到足夠的內(nèi)存。

③ 本地方法棧:

1)?概念:它與虛擬機(jī)棧所發(fā)揮的作用是相似的,區(qū)別是 java?虛擬機(jī)棧為執(zhí)行java?法服務(wù),而本地方法棧是為本地方法服務(wù)。

2)?特點(diǎn):線程私有,也會(huì)拋出兩類異常:StackOverflowError?OutOfMemoryError。

④ java?堆(重點(diǎn)):

1)?概念:是被所有線程共享的一塊區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。

2)?特點(diǎn):線程共享,存放的是對(duì)象實(shí)例所有的對(duì)象實(shí)例和數(shù)組),GC?管理的主要區(qū)域??梢蕴幱谖锢砩喜贿B續(xù)的內(nèi)存空間。

方法區(qū)(重點(diǎn)):

1)?概念:存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。

2)?特點(diǎn):線程共享的區(qū)域,拋出異常OutOfMemory?異常:當(dāng)方法區(qū)無法滿足內(nèi)存分配需求的時(shí)候。

以上所描述內(nèi)容,有看得懂的,也有看不懂的,例如:線程、本地方法等,這個(gè)需要大家在學(xué)習(xí)后面內(nèi)容之后,返回來再看一看,那個(gè)時(shí)候你就全部明白了。針對(duì)于目前來說,大家必須要知道 java 虛擬機(jī)有三塊主要的內(nèi)存空間,分別是“虛擬機(jī)棧后面簡(jiǎn)稱棧)”、“方法區(qū)”、“堆區(qū)”,方法區(qū)存儲(chǔ)類的信息,棧中存儲(chǔ)方法執(zhí)行時(shí)的棧幀以及局部變量,堆區(qū)中主要存儲(chǔ) new?出來的對(duì)象,以及對(duì)象內(nèi)部的實(shí)例變量。其中垃圾回收器主要針對(duì)的是堆內(nèi)存, 方法區(qū)中最先有數(shù)據(jù),因?yàn)槌绦驁?zhí)行之前會(huì)先進(jìn)行類加載。棧內(nèi)存活動(dòng)最頻繁,因?yàn)榉椒ú粩嗟膱?zhí)行并結(jié)束,不斷的進(jìn)行壓棧彈棧操作。

將目前階段需要掌握的內(nèi)存空間使用一張簡(jiǎn)單的圖表示出來,這個(gè)圖是大家需要掌握的:

java 虛擬機(jī)內(nèi)存管理簡(jiǎn)圖

大概了解了java 虛擬機(jī)內(nèi)存分配之后,來看看以下代碼在執(zhí)行過程中,內(nèi)存是如何變化的:

以上代碼在執(zhí)行過程中內(nèi)存的變化如下圖所示:

第一步進(jìn)行類加載
第二步main 方法調(diào)用,給main 方法分配棧幀(壓棧)


第三步執(zhí)行int i = 10,局部變量

第四步執(zhí)行new Student(),在堆中創(chuàng)建對(duì)象,同時(shí)初始化實(shí)例變量
第五步將堆區(qū)中學(xué)生對(duì)象的內(nèi)存地址賦值給局部變量s1

注意:上圖所描述內(nèi)存圖有些地方為了幫助大家更好的理解,有些位置畫的不是很精確, 隨著后面內(nèi)容的學(xué)習(xí)我們?cè)龠M(jìn)一步修改,目前上圖已經(jīng)夠大家用了。

上圖中i 變量和 s1?變量都是局部變量,都在棧內(nèi)存當(dāng)中,只不過i 變量是基本數(shù)據(jù)類型ints1 變量是引用數(shù)據(jù)類型Student。

上圖中堆區(qū)當(dāng)中的稱為“對(duì)象”,該“對(duì)象”內(nèi)部 no、nameage、sex 都是實(shí)例變量/屬性,這些變量在new 對(duì)象的時(shí)候初始化,如果沒有手動(dòng)賦值,系統(tǒng)會(huì)賦默認(rèn)值。

上圖堆區(qū)中“對(duì)象”創(chuàng)建完成之后,該對(duì)象在堆區(qū)當(dāng)中的內(nèi)存地址是:0x1111,程序中的=”將0x1111 這個(gè)堆內(nèi)存地址賦值給s1 變量,也就是說 s1 變量保存了堆內(nèi)存對(duì)象的內(nèi)存地址,我們對(duì)于這種變量有一種特殊的稱呼,叫做“引用”。也就是說對(duì)于 Student s1?= new Student() 代碼來說,s1 不是對(duì)象,是一個(gè)引用,對(duì)象實(shí)際上是在堆區(qū)當(dāng)中,s1??變量持有這個(gè)對(duì)象的內(nèi)存地址。

java 中沒有指針的概念指針是 C 語言當(dāng)中的機(jī)制,所以 java 程序員沒有權(quán)利直接操作堆內(nèi)存,只能通過“引用”去訪問堆內(nèi)存中的對(duì)象,例如:s1.no、s1.name、s1.sex、s1.age。 訪問一個(gè)對(duì)象的內(nèi)存,其實(shí)就是訪問該對(duì)象的實(shí)例變量,而訪問實(shí)例變量通常包括兩種形式, 要么就是讀取數(shù)據(jù),要么就是修改數(shù)據(jù),例如:System.out.println(s1.no)這就是讀取數(shù)據(jù),s1.no= 100 這就是修改數(shù)據(jù)。請(qǐng)看以下代碼:

運(yùn)行結(jié)果如下所示:

修改實(shí)例變量之后的執(zhí)行結(jié)果

執(zhí)行了以上程序之后,堆內(nèi)存對(duì)象的實(shí)例變量發(fā)生了變化,如下圖所示:

實(shí)例變量執(zhí)行賦值運(yùn)算之后的內(nèi)存圖

如果基于以上的代碼再創(chuàng)建一個(gè)對(duì)象,內(nèi)存圖會(huì)是怎么的呢?先看代碼:

JVM?內(nèi)存結(jié)構(gòu)圖如下所示:

創(chuàng)建多個(gè)對(duì)象的內(nèi)存結(jié)構(gòu)圖

?

通過上圖的學(xué)習(xí),可以看出假設(shè) new 100 個(gè)學(xué)生對(duì)象,會(huì)有 100 個(gè) no,100 個(gè) age...是這樣吧。

通過以上內(nèi)容的學(xué)習(xí),需要每位同學(xué)掌握:局部變量存儲(chǔ)在哪里?實(shí)例變量存儲(chǔ)在哪里? 實(shí)例變量在什么時(shí)候初始化?對(duì)象和引用有什么區(qū)別?在 java 中怎么訪問堆內(nèi)存當(dāng)中的對(duì)象?這些你都掌握了嗎?


最后附Java零基礎(chǔ)視頻教程給大家,配合學(xué)習(xí)效果更佳?。?/strong>



Java零基礎(chǔ)快速入門|對(duì)象的創(chuàng)建和使用(上)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
松潘县| 册亨县| 黄大仙区| 宁强县| 卓资县| 襄樊市| 繁昌县| 米林县| 扶沟县| 大丰市| 新安县| 扶余县| 石嘴山市| 靖西县| 朝阳市| 宝鸡市| 丹凤县| 鹤岗市| 临桂县| 漳浦县| 大方县| 华宁县| 龙里县| 永川市| 红安县| 清苑县| 白山市| 开封县| 隆昌县| 肇源县| 南宁市| 彝良县| 拉萨市| 湖南省| 横山县| 三门峡市| 舞钢市| 达拉特旗| 左贡县| 始兴县| 广饶县|