Java靜態方法和實例方法 java中的數組作為形參傳入


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,在堆中創建內存區域。再進行引用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM