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

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

开发者学堂课程【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。后面学习递归时这个机制尤其重要。

相关文章
|
3月前
学习使用如何调用外部函数
学习使用如何调用外部函数。
21 2
|
4月前
|
Java
Java 方法(方法的调用机制、方法的传参机制)
Java 方法(方法的调用机制、方法的传参机制)
44 0
|
4月前
|
JavaScript 前端开发 Java
函数和方法有区别吗?
函数和方法有区别吗?
29 0
|
7月前
通过普通方式调用和反射方式调用以及关闭检测后,通过反射方式调用的性能对比
通过普通方式调用和反射方式调用以及关闭检测后,通过反射方式调用的性能对比
|
Java
CheerpJ调用的两种方式
CheerpJ调用的两种方式
200 0
|
设计模式 SQL Java
调用MapperProxy对象|学习笔记
快速学习调用MapperProxy对象
162 0
调用MapperProxy对象|学习笔记
|
网络协议 测试技术 Go
方法的调用和传参机制 | 学习笔记
快速学习方法的调用和传参机制
82 0
方法的调用和传参机制 | 学习笔记
|
网络协议 编译器 测试技术
方法和函数区别说明|学习笔记
快速学习方法和函数区别说明
113 0
|
存储 Java 编译器
函数调用机制底层剖析 | 学习笔记
简介:快速学习函数调用机制底层剖析
106 0
|
小程序
小程序调用接口不生效?
小程序调用接口不生效?
312 0