當前位置:才華齋>計算機>java語言>

JAVA物件創造及記憶體佈局介紹

java語言 閱讀(2.14W)

下面是本站小編收集整理的關於JAVA物件創造及記憶體佈局介紹d的相關內容,歡迎閱讀!

JAVA物件創造及記憶體佈局介紹

  程序簡略介紹:

計算機對於記憶體的分配是以程序為單位的,每個程序在邏輯上是隔離的,每個程序都認為自己是這臺電腦上的唯一程式,自己面對所有的記憶體空間,(如,你的電腦有2G記憶體,那麼一個程序認為自己可以申請到2G的記憶體空間)這種技術叫做程序隔離技術,保證了系統不會因為一個程序的失敗,導致系統崩潰。一個程序可以向作業系統申請記憶體,(作業系統是系統資源的排程者,程序要使用資源必須向作業系統打報告)程序申請到的記憶體一般以兩種形式使用,一種是棧(stack)的形式,另一種是堆(heap)的形式。一個程序可以有多個棧,但只有一個堆。一個棧對應一個執行緒(thread),一個程序至少需要一個執行緒,即至少有一個棧。

現在有一個student類,如下

class student{

String name;

int age;

void gotoSchool(){

t("Let's go to school !");

}

void eat(){

t("Let's go to eat !");

}

}

現在來建立一個學生物件 Student stu = new Student();

該語句實際是Student stu = new Student student()的縮寫版,只是人們發現那樣寫很累,於是就把兩個student合二為一了。

下面分析一下該語句是如何執行的。 程序申請到記憶體空間,按照兩種方式分配,有的記憶體分配給棧,有的分配給堆。棧空間比較狹小,有大小限制,堆空間可以很大,大到和記憶體的容量一致。編譯器是從左到右進行編譯的,程式也是如此執行。

首先是碰到Student這樣一個符號(token),系統會馬上看下Student是什麼東西,不久它發現那是一個類,然後把整個類的程式碼載入(class loading)到記憶體中。程式的程式碼必須從磁碟上載入到記憶體中才能執行,其實cpu只跟記憶體打交道。只是因為一斷電什麼都沒了,所以後面才發明了硬碟,軟盤等。在堆中有一個程式碼區(code area),用來存放Student類的程式碼。因為棧的空間狹小,而類程式碼可能很大,所以要把類程式碼載入到堆中。

然後,遇到stu符號,即建立一個引用變數(或控制代碼),其資料型別是Student,因為Student類已經載入了,所以系統也知道了stu是什麼東西。因為引用變數指向一個地址(說白了就是儲存地址的變數而已,相當於C語言中的指標),所佔空間不大,所以把其建立在棧中即可。

接著從=右邊開始,先讀到new Student,即建立一個裸物件(naked object),或者說空白物件。因為類物件可能很大(如繼承),所以應建立在堆中。這個裸物件主要儲存自己的屬性,程式碼區中的程式碼只是指導如何去做,而真正申請記憶體空間是在物件中。每個物件都有一個隱藏屬性,叫做程式碼指標,指向物件所處的類,每個物件只要儲存自己個性化的特徵就行了,這樣可以減少記憶體的開銷,。方法可以共用,而屬性不可以,才能體現出個性化。就像你不想和別人共用一個名字一樣,但行為可以是一致的',可以一起上學、一起吃飯。每個物件還有另一個隱藏屬性,this指標,儲存了本物件在記憶體中的位置(俗稱為指向自己)。

ps:一個物件的大小隻跟屬性的多少有關,而和程式碼的數量無關。屬性是主人,方法是僕人,為屬性服務。一個裸物件通過初始化,使其內部的空白物件屬性獲得對應,體現出個性化,然後才能進入正式使用。就像人一樣,有名字、年齡、要上學等,從嬰兒到成人,其初 始化是一個漫長的過程。

再接著遇到student ( ),這是一個構造方法(constructor),呼叫該方法為空白物件提供初始化服務。

ps:構造方法地位重要,所以被特批能使用類名作為自己的名字,即與類同名。如果一個類沒有顯示書寫一個構造方法,系統會自動為其新增一個,該方法是一個無參空實現的構造方法。構造方法不能有返回值,而不是沒有返回值(沒有即為void).

最後把建立完的物件的地址通過=賦值給stu,以後對物件的的操作,只要通引用變數stu就可以了。我們可以把stu想像成是一根套住物件的繩子,繩子的資料型別決定了該繩子能套住什麼樣的物件。通過繩子對物件發號施令(就如我們用遙控器[引用]去操控電視機[物件]一樣),物件收到命令後會訪問其的程式碼指標,找到程式碼區中相應的程式碼並執行,人只能和棧打交道,而棧再和堆打交道。

至此語句Student stu = new Student( )就執行完了,接下去就是使用stu工作了。

ps:附件是物件建立記憶體佈局圖。