一段java代码是如何执行的?

沙海 2021年5月25日03:33:46Java评论57字数 2465阅读8分13秒阅读模式
摘要

速读摘要

速读摘要文章源自JAVA秀-https://www.javaxiu.com/25716.html

目前常见的java编辑工具,如eclipse和ideal都自带自动编译动能。栈的遵循的方式是先进后出,java栈中方法的执行也遵循此规律,方法执行的步骤又称为栈帧。方法或栈帧在java栈的执行顺序,但在方法体内的内容是怎么执行的呢。文章源自JAVA秀-https://www.javaxiu.com/25716.html

原文约 1729 | 图片 9 | 建议阅读 4 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/25716.html

一段java代码是如何执行的?

点击关注 ? Java面试那些事儿 文章源自JAVA秀-https://www.javaxiu.com/25716.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/25716.html

#Java面试那些事儿文章源自JAVA秀-https://www.javaxiu.com/25716.html

130个文章源自JAVA秀-https://www.javaxiu.com/25716.html

大家好,我是D哥文章源自JAVA秀-https://www.javaxiu.com/25716.html

点击关注下方公众号,Java面试资料 都在这里

文章源自JAVA秀-https://www.javaxiu.com/25716.html

来源:https://bbs.huaweicloud.com/blogs/250559文章源自JAVA秀-https://www.javaxiu.com/25716.html

文章源自JAVA秀-https://www.javaxiu.com/25716.html

当你学会了java语言之后,你写了一些代码,然后你想要执行你的代码,来达成某些功能。那么,你都知道这段代码都是如何执行的吗?文章源自JAVA秀-https://www.javaxiu.com/25716.html

文章源自JAVA秀-https://www.javaxiu.com/25716.html

# 编译成class

文章源自JAVA秀-https://www.javaxiu.com/25716.html

众所周知,java代码是不能直接在jvm上执行的,执行的是class文件,将java代码编程class文件,需要编译。文章源自JAVA秀-https://www.javaxiu.com/25716.html

文章源自JAVA秀-https://www.javaxiu.com/25716.html

常用的编译方法是:文章源自JAVA秀-https://www.javaxiu.com/25716.html

    javacxxx.java
    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    但目前常见的java编辑工具,如eclipse和ideal都自带自动编译动能。文章源自JAVA秀-https://www.javaxiu.com/25716.html

    # jvm的构成

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    让我们回忆一下jvm的构成:文章源自JAVA秀-https://www.javaxiu.com/25716.html

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    一段java代码是如何执行的?文章源自JAVA秀-https://www.javaxiu.com/25716.html

    主题上分为五个部分:文章源自JAVA秀-https://www.javaxiu.com/25716.html

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    方法区,本地方法栈,java堆,java栈,程序计数器文章源自JAVA秀-https://www.javaxiu.com/25716.html

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    其中,java栈,本地方法栈,程序计数器为线程私有,其余为线程共享文章源自JAVA秀-https://www.javaxiu.com/25716.html

    那么,方法在哪个地方执行呢?文章源自JAVA秀-https://www.javaxiu.com/25716.html

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    java栈。文章源自JAVA秀-https://www.javaxiu.com/25716.html

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    栈的遵循的方式是先进后出,java栈中方法的执行也遵循此规律,方法执行的步骤又称为栈帧。文章源自JAVA秀-https://www.javaxiu.com/25716.html

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    # 方法的顺序执行和栈帧

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    上代码:文章源自JAVA秀-https://www.javaxiu.com/25716.html

    文章源自JAVA秀-https://www.javaxiu.com/25716.html

    Java 代码文章源自JAVA秀-https://www.javaxiu.com/25716.html

      public class Main { public static void a(){ b(); } public static void b(){ c(); } public static void c(){ System.out.println("Hello world!"); } public static void main(String[] args) { a(); }}
      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      上面是一段很简单的代码,主体上就是:文章源自JAVA秀-https://www.javaxiu.com/25716.html

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      (1)一个Main类文章源自JAVA秀-https://www.javaxiu.com/25716.html

      (2)上面定义了一个main方法文章源自JAVA秀-https://www.javaxiu.com/25716.html

      (3)该main方法调用了静态方法a文章源自JAVA秀-https://www.javaxiu.com/25716.html

      (4)方法a调用方法b文章源自JAVA秀-https://www.javaxiu.com/25716.html

      (5)方法b调用方法c文章源自JAVA秀-https://www.javaxiu.com/25716.html

      (6)方法c打印了“Hello world!”文章源自JAVA秀-https://www.javaxiu.com/25716.html

      前文说过,java定义的非本地方法都是在java栈内执行的,一方法一栈帧文章源自JAVA秀-https://www.javaxiu.com/25716.html

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      所以假设文章源自JAVA秀-https://www.javaxiu.com/25716.html

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      mian方法对应栈帧m文章源自JAVA秀-https://www.javaxiu.com/25716.html

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      • a方法对应栈帧a文章源自JAVA秀-https://www.javaxiu.com/25716.html

      • b方法对应栈帧b文章源自JAVA秀-https://www.javaxiu.com/25716.html

      • c方法对应栈帧c文章源自JAVA秀-https://www.javaxiu.com/25716.html

      根据方法的调用,入栈顺序为:m,a,b,c文章源自JAVA秀-https://www.javaxiu.com/25716.html

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      所以,栈帧出栈(即方法执行)顺序为:c,b,a,m文章源自JAVA秀-https://www.javaxiu.com/25716.html

      # class文件反编译过后的样子

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      上一节,方法或栈帧在java栈的执行顺序,但在方法体内的内容是怎么执行的呢。文章源自JAVA秀-https://www.javaxiu.com/25716.html

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      前文提到,jvm执行的是class文件,而class文件内是什么?文章源自JAVA秀-https://www.javaxiu.com/25716.html

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      class文件内是一组指令集。文章源自JAVA秀-https://www.javaxiu.com/25716.html

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      如何证明呢,还是再看一段代码。文章源自JAVA秀-https://www.javaxiu.com/25716.html

      文章源自JAVA秀-https://www.javaxiu.com/25716.html

      Java 代码文章源自JAVA秀-https://www.javaxiu.com/25716.html

        public class Calculator{ public int add(){ int n = 10; int m = 20; int r = n + m; return r; } public static void main(String[] args) { Calculator calculator = new Calculator(); int a = calculator.add(); System.out.println(a); }}
        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        如上代码,实现的功能是:文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        (1)定义两个变量,相加文章源自JAVA秀-https://www.javaxiu.com/25716.html

        (2)main方法new对象,调用方法文章源自JAVA秀-https://www.javaxiu.com/25716.html

        但,class文件是不可以直接查看的。文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        我们可以采用反编译的方法,反编译命令:文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        javap -c xxx.class文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        一段java代码是如何执行的?文章源自JAVA秀-https://www.javaxiu.com/25716.html

        上述文件反编译后的样子如下:文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        一段java代码是如何执行的?文章源自JAVA秀-https://www.javaxiu.com/25716.html

        每个方法下面的Code,都是一组指令集。文章源自JAVA秀-https://www.javaxiu.com/25716.html

        # 指令集详解

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        在讨论指令集之前,首先要讲一个概念,那就是对栈帧进一步拆分。文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        栈帧一共分为四个部分:局部变量表、操作数栈、动态链接、方法返回地址文章源自JAVA秀-https://www.javaxiu.com/25716.html

        其中,局部变量表和操作数栈是最重要的两个部分,局部变量表存放在方法中定义的局部变量,操作数栈相当于jvm的一个缓存,所有的操作都必须在此处进行,所有的变量都必须加载到操作数栈才能被使用。所以,所谓指令,就是在局部变量表和操作数栈来回倒腾的过程。文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        下面对指令进行分类讲解:文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        (1)入栈指令

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        整型入栈指令:文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • 取值-1~5采用iconst指令;文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • 取值-128~127采用bipush指令;文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • 取值-32768~32767采用sipush指令;文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • 取值-2147483648~2147483647采用ldc指令。文章源自JAVA秀-https://www.javaxiu.com/25716.html

        非整型入栈指令:文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • float,String类型也使用ldc指令文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • double和long类型使用ldc_2w文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • boolean类型视作0和1文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • null的入栈指令为:aconst_null文章源自JAVA秀-https://www.javaxiu.com/25716.html

        (2)存储指令

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        将操作数栈中的常量保存在局部变量表中的某个位置文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        如:文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • istore_1:将上面入栈的整型常量保存在局部变量表中的第1个位置文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • fstore_2:将上面入栈的浮点常量保存在局部变量表中的第2个位置文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • dstore_10:将上面入栈的双浮点常量保存在局部变量表中的第10个位置文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • lstore_20:将上面入栈的长整常量保存在局部变量表中的第20个位置文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • astore_100:将上面入栈的引用常量保存在局部变量表中的第100个位置文章源自JAVA秀-https://www.javaxiu.com/25716.html

        (3)变量入栈指令

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • iload_1:局部变量表中的第1个位置的整型变量入栈文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • fload_2:局部变量表中的第1个位置的浮点型变量入栈文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • dload_10:局部变量表中的第1个位置的双浮点型变量入栈文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • lload_20:局部变量表中的第1个位置的长整型变量入栈文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • aload_100:局部变量表中的第100个位置的引用型变量入栈文章源自JAVA秀-https://www.javaxiu.com/25716.html

        (4)计算指令

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        • 加:iadd、ladd、fadd、dadd减:isub、lsub、fsub、dsub乘:imul、lmul、fmul、dmul除:idiv、ldiv、fdiv、ddiv文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        注意:栈顶计算,一次只能计算一个表达式文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html

        一段java代码是如何执行的?热门推荐:文章源自JAVA秀-https://www.javaxiu.com/25716.html

        一段java代码是如何执行的?简历&面试题&视频资料获取 一段java代码是如何执行的?文章源自JAVA秀-https://www.javaxiu.com/25716.html

        扫描下方二维码,回复关键字【 java文章源自JAVA秀-https://www.javaxiu.com/25716.html

        一段java代码是如何执行的?文章源自JAVA秀-https://www.javaxiu.com/25716.html

        一段java代码是如何执行的?文章源自JAVA秀-https://www.javaxiu.com/25716.html

        文章源自JAVA秀-https://www.javaxiu.com/25716.html
        继续阅读
        速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
        weinxin
        资源分享QQ群
        本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
        沙海
        匿名

        发表评论

        匿名网友 填写信息

        :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

        确定