九天学会Java,第七天,程序运行结构

  • 变量和数据类型,赋值和输出
  • 算术运算
  • 选择结构
  • 循环结构
  • 函数定义,函数调用
  • 变量作用域
  • 栈,程序运行的基石 <---
  • 面向对象
  • 异常处理
  • 语言提供的公用包

现在高级语言之所以能调用函数,能在不同的类实例切换来切换去,是得利于stack(栈)这个数据结构。栈是一种先进后出的数据结构,用图表示可参考如下:

image

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出栈,栈为空
     */
}

image

程序从main开始运行,此时main context压入栈中

image

调用level1,level1 context压栈,此时栈底是main context,栈顶是leve1 context

image

调用level2,level2 context压栈,此时栈顶是level2 context

image

调用level3,level3 context压栈,此时栈顶是level3 context

当函数level3运行结束后,level3会退出栈,此时栈的状态是

image

其余同理。有了栈,我们就实现了函数层层调用。所以说栈是现代程序运行的基石。

理解这个简单实用的数据结构,对你理解程序运行机制,变量作用域都很用帮助。

posted @ 2018-04-15 20:23  kayv  阅读(313)  评论(0编辑  收藏  举报