如今高級語言之因此能調用函數,能在不一樣的類實例切換來切換去,是得利於stack(棧)這個數據結構。棧是一種先進後出的數據結構,用圖表示可參考以下:數據結構
5入棧以後,棧中只有一個元素5。6再入棧後,有5和6,其中5在棧底,6在棧頂。函數
接着,6出棧後,棧裏只有5。5再出棧後,棧爲空。code
可能你會好奇,這跟函數,面向對象有什麼關係,彆着急。對象
後面我用一個示例演示函數,對象實例是怎麼像積木同樣堆起來,又一個個卸下去。作用域
注意跟着(1)(2)。。的順序來看註釋class
/** * 本示例演示stack是如何工做的 */ public class StackTalk { public static void level1() { /** (2) * 調用level1時,level1的context壓入棧內 * 此時棧裏有level1 context,棧底是main 的context */ int level1Val = 1; level2(); /** (6) * 調用完level2以後,level2的context出棧 * 此時棧裏有level1和main context */ System.out.println("level:" + level1Val); } public static void level2() { /** * (3) 調用level2時,level2的context壓入棧內 * 此時棧裏有level2, level1和main context */ int level2Val = 2; level3(); /** (5) * 調用完level3以後,level3的context出棧 * 此時棧裏有level2, level1和main context */ System.out.println("level:" + level2Val); } public static void level3() { /** * (4) 調用level3時,level3的context壓入棧內 * 此時棧裏有level3, level2, level1和main context */ int level3Val = 3; System.out.println("level:" + level3Val); } public static void main(String[] args) { int mainLevel = 0; /** (1) * 在調用level1以前,main函數的context壓入棧內 * 此時棧裏有mainLevel * 接着調用level1 */ level1(); /** (7) * 調用完level1以後,level1的context出棧 * 此時棧裏有main context */ System.out.println("level:" + mainLevel); } /** * (8) * 程序結束後,main context出棧,棧爲空 */ }
程序從main開始運行,此時main context壓入棧中變量
調用level1,level1 context壓棧,此時棧底是main context,棧頂是leve1 context循環
調用level2,level2 context壓棧,此時棧頂是level2 context數據類型
調用level3,level3 context壓棧,此時棧頂是level3 context程序
當函數level3運行結束後,level3會退出棧,此時棧的狀態是
其他同理。有了棧,咱們就實現了函數層層調用。因此說棧是現代程序運行的基石。
理解這個簡單實用的數據結構,對你理解程序運行機制,變量做用域都很用幫助。