008-Java中方法的使用(進階篇)
目錄
一、方法的重載(overload)
一、什麼是方法的重載
- 在同一個類中
- 方法名相同
- 參數列表不同
- 參數個數不同算不同
- 參數類型不同算不同
- 參數順序不同算不同
只要同時滿足上面三個條件,那麼我們就可以認定方法之間發生了重載機制,註:
方法重載和方法的返回值類型無關
方法重載和方法的修飾符列表無關
二、方法執行時的記憶體變化
一、JVM主要三塊記憶體空間
- 方法區:最先有數據,存放程式碼片段,存放class位元組碼文件;
- 堆記憶體:這裡先賣個關子,後面部落格會補上的;
- 棧記憶體:方法調用的時候,該方法需要的記憶體空間在棧中分配,方法不調用時是不會在棧中分配空間的;
註:這只是主要三塊記憶體空間,除了這三塊還有其他的。
二、關於棧的數據結構(如圖)
由於方法調用時所需要的記憶體空間在棧中分配,因此這裡需要簡單的了解一下棧的數據結構;
數據結構是存儲數據的容器,而該容器在存儲數據時存在著不同的結構,棧就是其中一種結構:
- 棧存儲數據的特點:先進後出,後進先出;
- 棧存儲的是方法運行過程中需要的記憶體,以及棧中會存儲方法的局部變數;
- 方法只有在調用的時候才會在棧中分配記憶體,此時成為:壓棧;
- 方法在執行結束之後,該方法所需要的空間就會釋放,此時稱為:彈棧;
三、方法執行過程記憶體變化(用以下程式碼演示)
- 程式碼圖
2. 運行結果
3. 記憶體變化圖
三、方法的遞歸
一、遞歸的使用及其記憶體圖
- 程式碼圖
2. 記憶體變化圖(這裡只畫出棧記憶體)
二、遞歸的注意事項
- 當遞歸時候程式沒有結束條件,一定會發生:棧記憶體溢出錯誤:Stack OverflowError,因此,遞歸必須要有結束條件;
- 遞歸假設是有結束條件時,假設這個結束條件是對的,是合法的,遞歸有的時候也會出現棧記憶體溢出錯誤,因為有可能遞歸的太深,棧記憶體不夠了。因為一直在壓棧;
- 在實際中,不建議輕易的選擇遞歸,能用for循環while循環代替的,盡量使用循環來做。因為循環的效率高,耗費的記憶體少。遞歸耗費的記憶體比較大,另外遞歸的使用不當,會導致JVM死掉;
相關鏈接:
鏈接: 007-Java中方法的使用(基礎篇).
鏈接: 006-Java的訪問許可權控制符和包導入機制.
鏈接: 005-Java中的控制語句.