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