函数(方法)的调用机制|学习笔记

简介: 快速学习函数(方法)的调用机制。

开发者学堂课程【Scala 核心编程-基础函数(方法)的调用机制】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/8930


函数(方法)的调用机制

 

内容介绍

一、案例说明

二、函数调用机制流程分析

 

一、案例说明

现在要探讨的话题就是函数的基本运行原理,那么,函数的调用机制如果用。比较通俗易懂的方式。

image.png

就是如图程序员调用方法,然后返回一个结果。如果放在一个内存来分析的话,就是如下这个案例。

为了让大家更好的理解函数调用机制,看1个案例,并画出示意图,这个很重要,比如 getSum 计算两个数的和,并返回结果。

新建 FunYuanli 文件,写入代码:

object Test01 {

def main(args: Array[String]): Unit = { I

val n1=1

val n2=3

val res = sum(n1, n2)

println("res=" + res)

}

def sum(n1: Int, n2: Int): Int = {

return n1 + n2

}

}

整个代码就是传入1和3然后进行返回结果。源代码的入口是从主函数开始的,那么在内存中,是怎样运行函数或者方法的呢?

 

二、函数调用机制流程分析

函数调用机制示意图

image.png

如图,首先在内存中有一大块空间叫做栈,栈是一种数据结构。栈是一种特别重要的数据结构,可以实现很多功能比如说 a+b1+2等最底层都是栈在工作,进行的是压栈出栈的操作。当函数进入到 main 过后,在栈中会开辟一个空间为 main 主栈在实际工作中是没有这个名字的,而是一个地址进行表示。就是栈里面是一个独立的空间,其中有 n1[1],n2[3],当它执行到这个地方后,紧接着会调用一句话res = sum(n1, n2),sum 传入了 n1,n2,栈中是没有这个代码的,只是不停的在出栈进栈,这里只是为了方便观看。而sum会在底层开辟一个新的独立的栈,调用后会保留现场,就是为了将来执行后可以返回,留下的一个地址。main 栈和 sum 栈都在大的栈内存空间中,只是为了方便区分化为两个。跳到 sum 语句后,println 语句会被中断,跳到 def 语句执行,在 sum 栈中,又会出现一个n1[1],n2[3],虽然名字相同,但是两个栈中 n1,n2是独立的,最后 n 1+n2的结果为4最后结果就会返回给 sum,因为 sun 保留了现场,所以代码会从 sum 栈中回到 main 栈,返回结果为4,而一旦返回结果后,sum 栈就已经没有用了,那么在最底层是如何把sum栈拿掉的呢?其实最早在 main 栈有一个指针,当还没有 sum 栈的时候,指针是指向 main 栈的,当调用sum栈产生的时候,栈指针则指向 sun 栈顶,又当 return 返回过后,栈指针就指向 main 栈顶,而 sum 栈就不再引用了。等到 res 返回后就继续执行下面的代码,就是执行 println 语句,最后输出结果为4。后面学习递归时这个机制尤其重要。

相关文章
|
1月前
学习使用如何调用外部函数
学习使用如何调用外部函数
31 8
|
3月前
|
存储 前端开发 rax
函数过程的调用
函数过程的调用
|
6月前
|
Rust Java Serverless
函数与方法的区别
函数与方法的区别,当然是有区别。 不管是java、rust还是go,他们都是不一样的。
60 1
|
6月前
|
Java
Java 方法(方法的调用机制、方法的传参机制)
Java 方法(方法的调用机制、方法的传参机制)
65 0
通过普通方式调用和反射方式调用以及关闭检测后,通过反射方式调用的性能对比
通过普通方式调用和反射方式调用以及关闭检测后,通过反射方式调用的性能对比
|
前端开发
前端学习案例17-promise的理解方式&调用机制4
前端学习案例17-promise的理解方式&调用机制4
63 0
前端学习案例17-promise的理解方式&调用机制4
|
前端开发
前端学习案例3-promise的理解方式和调用机制2
前端学习案例3-promise的理解方式和调用机制2
58 0
前端学习案例3-promise的理解方式和调用机制2
|
前端开发
前端学习案例2-promise的理解方式和调用机制1
前端学习案例2-promise的理解方式和调用机制1
52 0
前端学习案例2-promise的理解方式和调用机制1
|
前端开发
前端学习案例15-promise的理解方式&调用机制2
前端学习案例15-promise的理解方式&调用机制2
77 0
前端学习案例15-promise的理解方式&调用机制2
|
前端开发
前端学习案例16-promise的理解方式&调用机制3
前端学习案例16-promise的理解方式&调用机制3
71 0
前端学习案例16-promise的理解方式&调用机制3