Java靜態方法和例項方法 java中的陣列作為形參傳入

wyfem發表於2021-09-09

Java靜態方法和例項方法 java中的陣列作為形參傳入

Java虛擬機器

啟動一個Java程式的時候,會誕生一個虛擬機器例項,當程式關閉退出時,該例項會消失。
如果一個機器上執行著三個Java程式,即有三個Java虛擬機器例項
Java虛擬機器會呼叫某個初始類的main()方法執行一個Java程式,此方法將會作為程式的初始執行緒啟動,任何執行緒都是由主執行緒啟動的。

守護執行緒和非守護執行緒

Java虛擬機器有兩種執行緒,守護執行緒和非守護執行緒。
例如垃圾收集任務的執行緒,屬於守護執行緒。

Java可以將建立的任何執行緒定義為守護執行緒

main為非守護執行緒,當虛擬機器中的所有非守護執行緒終止的時候,虛擬機器例項將會自動退出。

類載入器

用於載入class檔案中的類

執行資料區

分為本地方法區,堆,棧,暫存器,本地方法棧

方法區

被稱為靜態區,和堆一樣,會被所有執行緒共享。方法區會包含靜態的class和static變數

在java虛擬機器啟動的時候會被裝載

儲存物件,即new出的例項,會在堆中儲存。
會被所有執行緒共享,不存放基本型別和物件引用。

物件中會有一個指向方法區的指標,用來把堆中new出的物件和方法區的類和靜態變數連線起來

堆有兩個部分,一個控制程式碼池,一個物件池。

控制程式碼池

控制程式碼池有兩部分,一個指向物件變數的指標

a e = new a()

其中,儲存的是執行物件變數的指標,即指向棧中e的變數的地址

還有一部分是指向方法區中的指標
即指向方法區中類a的指標

物件鎖

虛擬機器中每個物件都有一個物件鎖,用於協調多個執行緒訪問同一個物件時的同步

關於陣列

在Java中和js一個樣子
陣列即物件,物件即陣列
陣列是儲存在堆中的
所以,在呼叫方法的時候傳入陣列即傳入了物件,這個時候(由於java中只有一個堆,用來儲存物件)在方法中對陣列的操作,即操作了堆中物件的操作。

和棧不同,屬於直接引用了堆中的地址,屬於引用而不是開闢了一塊新的儲存空間。即一個指標,指向其堆中陣列的地址

每次啟動一個新執行緒的時候,Java虛擬機器會為其其分配一個棧。
Java虛擬機器只執行出棧和壓棧的操作。
某個執行緒執行的方法稱為該執行緒的當前方法,當前方法使用的棧幀屬於當前幀。當前方法屬於的類稱為當前類,當前類的常量池稱為當前常量池。
每個執行緒呼叫一個Java的方法的時候,會在該執行緒的Java棧中壓入一個新棧,這個新棧稱為當前幀,這個幀用來儲存一些非靜態變數的內容。
當方法呼叫完成以後,會彈出幀,銷燬內容

關於方法呼叫傳入陣列和變數的的區別,陣列,是一個物件,指向堆中的一塊儲存地址,變數,屬於當前方法幀中的方法棧,呼叫的時候會直接壓棧,呼叫完成以後會執行出棧操作。所以傳入變數不會儲存,傳入陣列會儲存更改

Java棧上的資料所有資料是此執行緒私有的。不能被其他執行緒共享

堆 會被共享,方法區會被共享

靜態方法和例項方法

靜態方法會在程式執行的時候直接裝載進入方法區。而例項方法會在new的時候以物件的方法裝載進入堆中。
最大的區別在於記憶體的區別,由於main函式為static靜態方法,會直接在執行的時候裝載進入記憶體區,例項方法必須new,在堆中建立記憶體區域。再進行引用。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2894/viewspace-2815088/,如需轉載,請註明出處,否則將追究法律責任。

相關文章