JAVA基础:JVM中方法的执行过程和方法的重载,递归,可变参数的含义

1 JVM中方法的执行过程

1.1 JVM内存模型

jvm内存,存储java程序执行过程中产生的一些数据。

JVM将内存分成了不同的逻辑区域,存储不同含义(类别)的数据

JVM内存模型有5种

  • 方法区 : 存储类信息

  • 堆区 : 存储new关键字产生的数据 (目前是数组)

  • 栈区 : 存储的是(主)方法执行时,产生的数据

  • 本地方法栈 : 与栈区类似,

  • 程序计数器 : 记录当前方法执行到哪一行了。

方法区和堆区中存储的数据,可以较长时间存在

栈区(本地方法栈)和程序计数器中存储的数据,随着方法执行完毕,就消失了

1.2 方法压栈弹栈

方法在执行的时候,会由JVM中的执行引擎(解释器),依次执行方法中代码

由于方法在执行过程中会产生许多的数据,这些数据需要临时存储在栈区中

由于程序执行时会调用很多方法,所以会产生很多数据。

会为每一个方法产生的数据在栈区提供一个独立的存储空间,这个空间称为:栈帧

每调用一个方法,就会在栈区中产生一个栈帧,并且在栈区最上面,表示正在执行方法所对应的栈区,这个过程称为:压栈

当一个方法执行完毕后,其用来存储数据的栈帧空间也就可以回收了,这个 过程称为:弹栈

 

随着方法执行,其对应的栈帧压栈, 之前正在执行的方法被压在了下面,停止执行,等待当前这个方法执行完毕

随着当前方法执行完毕,其对应 的栈帧弹栈,之前被压下去栈帧重新回到栈顶,表示对应的方法重新继续执行

栈是一种数据存储结构

存储特点是:先进后出 FILO

1.3 栈帧结构

栈帧也是一个存储结构,用来存储方法执行时产生的数据,也有不同的区域划分

 

  • 局部变量表 : 存储方法中定义的变量(包括参数列表中的变量)。

    不一定是一个变量对应一个局部变量表空间。

    有些变量在前面的代码中使用完,后面就不在使用了。

    这样后面的变量就可以复用前面变量的空间

  • 操作数栈 : 存储方法运行时,因为计算所需要的临时数据

    存储计算时,从变量中取出来的数据

    操作数栈中的数据随着使用,就随着消失

    (将输入取出过程称为压栈, 数据使用完毕后消失过程称为弹栈)

  • 返回地址 : 记录当前方法调用者执行的行号 (上一个方法执行到第几行的时候,才调用了当前方法)

  • 动态链接 : 暂时不做了解

计算过程中栈帧结构的变化 :

public static void doSum(int num1 , int num2){int sum = num1 + num2 ;return sum ;
}

 

方法调用传参时的栈帧结构

A方法调用B方法时, A方法的操作数栈与B方法的局部变量表由重叠

public static void b(int num){}public static void a(){int num = 10 ;int sum = num ;b(num);
}

 

1.4 JVM执行过程

 

2 可变参数

方法调用时, 传递的实参数量,是由被调用方法的参数列表数列决定的。

传递的实参数量必须与形参变量数量相同

有一种特殊的参数,允许调用时传递的实参数量是可变,这种参数就称为:可变参数

语法

public static void t1(int num1 , int num2){}public static void t2(int...nums){}main(){t1(10,30) ;t1(10) ;//错t1(10,20,30);//错t2();  //正确t2(10);//正确t2(10,20,30);//正确
}

 

特点

  • 可变参数的本质是一个数组。

  • 拥有者在使用可变参数时,无论传递多少个数据,都以数组的语法进行操作。

    传递了多少个数据,数组的长度就是多少。

  • 调用者在传递参数的时候,可以传递任意数量的参数,0 , 1, n,还可以传递数组

  • 方法的参数列表中,只能定义一个可变参数。

  • 方法的参数列表中一旦定义了可变参数,只能是最后一个参数

3 方法重载

在一个类中,多个方法的名称相同,参数列表不同,执行不同的操作,就称这多个方法为重载方法。

  • 参数列表不同体现在 参数的个数和类型不同

  • 方法重载与访问权限,修饰符,返回类型,异常声明无关。

调用时,会自动的根据方法名和参数列表却分调用的到底哪一个方法。

public static int sum(int num1,int num2){}
public static int sum(int num1 , int num2 , int num3){}
public static double sum(double num1 , double num2){}public static double sum(int num1, int num2){}  //错误

 

4 方法递归

简而言之就是方法的自身调用。 也可以是方法组自身的调用

  • 递归类似循环,可以实现功能的反复执行。在某些(算法)环境下,比使用循环更轻松。

  • 递归的本质就是方法的不同调用,就会不同的产生栈帧压栈,栈空间有限,一个逻辑性不合理的递归会导致栈内存溢出(满了),所以递归时我们一般都会有一个结束条件。

public static void t1(){t1();
}public static void t2(){t3();
}
public static void t3(){t2();
}

 

递归公式:要想做a这件事,需要先做b那件事。a和b是一样的事

  • 当我们分析程序的时候,如果分析出递归公式,就可以考虑使用递归实现功能

  • 如果我们看到了一个使用递归实现的功能,应该可以分析出其对应的递归公式

递归与循环的对比

  • 循环一定是一次执行完了, 再执行下一次。

  • 递归是一次执行到一半,就执行下一次。等下一次执行完, 这一次还要继续执行。

  • 递归不适合捋代码流程。只适合与递归公式碰撞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1524154.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

flux 文生图大模型 自有数据集 lora微调训练案例

参考: https://github.com/ostris/ai-toolkit 目前 Flux 出现了 3 个训练工具 SimpleTuner https://github.com/bghira/SimpleTuner X-LABS 的https://github.com/XLabs-AI/x-flux ai-toolkit https://github.com/ostris/ai-toolkit 待支持:https://github.com/kohya-ss/sd-s…

k8s调度、污点、容忍、不可调度、排水、数据卷挂载

一、Kubernetes的list-watch机制 1、List-watch K8S集群中,通过List-watch机制进行每个组件的协作,保持数据同步。这种设计可以实现每个组件之间的解耦 kubectl配置文件,统一向集群内部apiserver发送命令——通过apiserver把命令发送到各个…

如何构建可靠云服务:亚马逊云科技的云端韧性之道

“控制面和数据面的隔离,类似于叫车软件和打车,两者其实是相对独立的。当你坐上车以后,如果一段时间叫车软件没有信号无法响应了,也不影响司机将你送到预定的目的地。很多故障失效的情况,关键在于没有把数据面和控制面…

JAVA毕业设计167—基于Java+Springboot+vue3+小程序的物业管理系统小程序(源代码+数据库+万字论文+文献综述)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3小程序的物业管理系统小程序(源代码数据库万字论文文献综述)167 一、系统介绍 本项目前后端分离带小程序(可以改为ssm版本),分为用户、管理员两…

linux环境下升级nodejs版本

文章目录 简介清除缓存信息确保已安装Node.js和npm安装n模块使用n来升级Node.js查看可用的Node.js版本升级Node.js到最新版本注意事项版本兼容性考虑 简介 在Linux环境下,使用npm的n模块来升级Node.js版本是一种非常流行且便捷的方法。n是一个Node.js版本管理工具&…

如何选择SSD

如何选择SSD 如何选择SSDSSD外形规格2.5”M.2mSATAU.2 接口:SATA 与 NVMeSATANVMe在光纤介质上实现NVMe在互联网上实现NVMe 如何选择SSD 系统中存储连接的类型及其外形因素(SSD 的形状和大小)会影响您的决策。SSD具有 SATA 或 NVMe&#xff…

[UVM]4.phase机制 run_phase 12支phase UVM编译仿真顺序 raise_objection

1.phase机制 (1)SV中new()无法解决例化的先后关系以及例化后的连接,同时SV也无法再例化前对底层进行配置逻辑。这就引入了phase。 (2)执行机制 9个主要的phase机制,其中只有一个是…

影石相机tf内存卡数据格式化后恢复方法

在数字化时代,‌相机成为了我们记录生活、‌捕捉瞬间的重要设备。‌影石相机,‌以其出色的性能和便捷的操作,‌赢得了众多摄影爱好者的青睐。‌然而,‌在使用过程中,‌我们可能会遇到一些意外情况,‌如不小…

打包部署之---》Xshell使用不了如何部署

前端打包发布有很多种,常用 xshell 连接服务器打包发布,但是小编发现最近小编电脑上的Xshell7出现了一个问题,一直报50003错误,说是不是最新版本;让你升级 可是点击确定以后确提示小编已经是最新版本; 这个时候小编选择…

JVM方法区

JVM方法区 《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。“但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。方法区…

kali——wpscan的使用

目录 前言 查看帮助(-h) ​编辑 常规扫描(--url) 破解用户名和密码 插件枚举 扫描插件漏洞 扫描主题漏洞 前言 wpscan 是 Kali Linux 自带工具,主要用于扫描WordPress网站的各种安全漏洞,包括Word…

第一个golang项目

第一个golang项目 开发环境安装golangVisual Studio Code安装golang语言插件初始化项目创建目录初始化golang配置 开始开发安装所需依赖创建main.go创建配置文件创建命令版本命令查看指定目录指定后缀文件并将指定内容替换为新内容 打包并运行 前因后果:因为工作需要…

Sui Hacker House曼谷站报名开启:在Devcon 2024期间探索Sui区块链创新

Sui 曼谷 Hacker House 报名开启 Sui Bangkok Hacker House 将在曼谷于 2024 年 11 月 4 日至 17 日举办。诚邀开发者深入学习 Move 语言,在 Sui 网络上构建 MVP ,在充满活力的曼谷中度过难忘的两周。 诚挚地邀请开发者加入为期两周的 Sui Bangkok Hacker House。 你将与其他…

CentOS7 MySQL 数据库基本使用

3.查看当前库中存在哪些表 mysql> show tables 4.查看表的结构 mysql> describe user mysql> describe mysql.user 5.查询数据库服务的基本信息 mysql> status 二、创建及删除库和表 1.创建新的库 CREATE DATABASE 语句:用于创建一个新的库&…

图像白平衡

目录 效果 背景 什么是白平衡? 实现原理 将指定图色调调整为参考图色调主要流程 示例代码 效果 将图一效果转换为图二效果色调: 调整后,可实现色调对换 背景 现有两张图像,色调不一致,对于模型重建会有影响。因…

不小心删除丢失了所有短信?如何在 iPhone 上查找和恢复误删除的短信

不小心删除了一条短信,或者丢失了所有短信?希望还未破灭,下面介绍如何在 iPhone 上查找和恢复已删除的短信。 短信通常都是非正式和无关紧要的,但短信中可能包含非常重要的信息。因此,如果您删除了一些短信以清理 iPh…

vivado 创建时间约束1

步骤3:创建时间约束 在此步骤中,您打开合成的设计并使用AMD Vivado™定时约束 男巫定时约束向导分析门级网表并发现缺失 约束。使用“定时约束”向导为此设计生成约束。 1.在“流导航器”中,单击“打开综合设计”。 2.当综合设计打开时&#…

使用vscode编辑matlab完美解决方法

vscode里面的matlab插件都不好用,需要搭配互补一下 1先安装MATLAB 这个插件可以进行代码高亮、格式化、跳转,F5运行所有代码,或者选中要运行的代码,右键单独运行, 优点:运行速度很快,和matlab里…

HA里面如何添加美的智能设备

环境: Home Assistant 2023.8.0 问题描述: HA里面如何添加美的智能设备 解决方案: 1.打开 HACS 菜单,点开其中的集成选项,点击右下角的“浏览并下载存储库”,之后再搜索 Midea AC LAN 点击下载 如果下…

Qt将数据库中的数据导出为html

一、源码分享 bool ReportFormUtils::exportReportHtml(QString &errString, const QString tableName, const QString savePathAndName, const QString tableTitle, const QString tableInfo) {Q_UNUSED(errString)Q_UNUSED(tableName)Q_UNUSED(savePathAndName)#define …