九天学会Java,第七天,程序运行结构
- 变量和数据类型,赋值和输出
- 算术运算
- 选择结构
- 循环结构
- 函数定义,函数调用
- 变量作用域
- 栈,程序运行的基石 <---
- 面向对象
- 异常处理
- 语言提供的公用包
现在高级语言之所以能调用函数,能在不同的类实例切换来切换去,是得利于stack(栈)这个数据结构。栈是一种先进后出的数据结构,用图表示可参考如下:
5入栈之后,栈中只有一个元素5。6再入栈后,有5和6,其中5在栈底,6在栈顶。
接着,6出栈后,栈里只有5。5再出栈后,栈为空。
可能你会好奇,这跟函数,面向对象有什么关系,别着急。
后面我用一个示例演示函数,对象实例是怎么像积木一样堆起来,又一个个卸下去。
注意跟着(1)(2)。。的顺序来看注释
/**
* 本示例演示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会退出栈,此时栈的状态是
其余同理。有了栈,我们就实现了函数层层调用。所以说栈是现代程序运行的基石。
理解这个简单实用的数据结构,对你理解程序运行机制,变量作用域都很用帮助。