如今高级语言之因此能调用函数,能在不一样的类实例切换来切换去,是得利于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会退出栈,此时栈的状态是
其他同理。有了栈,咱们就实现了函数层层调用。因此说栈是现代程序运行的基石。
理解这个简单实用的数据结构,对你理解程序运行机制,变量做用域都很用帮助。