这段程序大概这样:


public static void main(String[] args){
int a = 2;
System.out.println(a+++a++);
}

编译后的字节码为:


public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=2, args_size=1
0: iconst_2 /*将int型2推送至栈顶*/
1: istore_1 /*将栈顶int型数值存入第二个本地变量,这里就是完成a=2的步骤*/
2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; /*获取指定类的静态域,并将其值压入栈顶*/
5: iload_1 /*将第二个int型本地变量推送至栈顶,现在栈顶的值为a的值 2 */
6: iinc 1, 1 /*将指定int型变量增加指定值,现在a的值为3 */
9: iload_1 /*将第二个int型本地变量推送至栈顶,栈顶的值为 3 */
10: iinc 1, 1 /*将指定int型变量增加指定值,现在a为4*/
13: iadd /*将栈顶两int型数值相加并将结果压入栈顶,前面压入栈顶的值分别为2和3,所以现在栈顶的值为 5 */
14: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
17: return
LineNumberTable:
line 4: 0
line 5: 2
line 6: 17
}
SourceFile: "Test.java"

现在,如果把程序换一下:


public static void main(String[] args){
int a = 2;
System.out.println(a+++(++a));
}

现在字节码为:


public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=2, args_size=1
0: iconst_2
1: istore_1 /*完成a=2的赋值*/
2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
5: iload_1 /*a的值压入栈顶,为 2 */
6: iinc 1, 1 /*a自增长 a=3*/
9: iinc 1, 1 /*a自增长 a=4*/
12: iload_1 /*a值压入栈顶,为 4*/
13: iadd /*两值相加,为 6*/
14: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
17: return
LineNumberTable:
line 4: 0
line 5: 2
line 6: 17
}
SourceFile: "Test.java"

Java 初始化a=2 打印a+++a++为5的更多相关文章

  1. Java初始化过程

    这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...

  2. Java jacob调用打印机打印word文档

    前面说了Java如何生成复杂的Word文档,今年记录下Java如何调用打印机打印word文档. 起初用的是自带的PrintJob,但是系统提供的打印机制并不成熟完整.网上的代码也是千篇一律,在我的打印 ...

  3. Java初始化顺序

    package com.helei.init; class Log { public static String fatherStaticString(){System.out.println(&qu ...

  4. (原)Java初始化过程

    先看一个demo,然后进行归纳. class X{ static M m=new M(); Y y=new Y(); public X(){ System.out.print("X" ...

  5. Java初始化生命周期

    package com.init; abstract class Glyph { void draw() { System.out.println("Glyph.draw()"); ...

  6. Java初始化理解与总结 转载

    Java的初始化可以分为两个部分: (a)类的初始化 (b)对象的创建 一.类的初始化 1.1 概念介绍: 一个类(class)要被使用必须经过装载,连接,初始化这样的过程. 在装载阶段,类装载器会把 ...

  7. Java 初始化字段方式和顺序

    Java 初始化字段方式和顺序: 类加载时直接初始化静态字段; 类加载时调用静态方法初始化静态字段; 实例化对象时,在调用构造函数之前代码块中初始化字段; 实例化对象时,在调用构造函数之时初始化字段; ...

  8. Java 初始化的个人理解

    先说明一下由来吧,下面是同学的一道笔试题,以前感觉对java初始化也是了解一二的,结果,看到这题泪奔了,不会...上网查,自己添加println,总算是能把自己讲明吧了,不知理解的对不对,先记录下吧, ...

  9. [转]Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数

    Java初始化顺序1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包 ...

随机推荐

  1. 简单又实用的分享!SharePoint母版页引用(实战)

    分享人:广州华软 极简 一. 前言 此SharePoint 版本为2013,请注意版本号.此文以图文形式,描述了根网站及子网站引用母版页,需要注意的点已用图文形式以标明. 本文适用于初学者. 二. 目 ...

  2. asp.net core系列 54 IS4用客户端凭据保护API

    一. 概述 本篇开始进入IS4实战学习,从第一个示例开始,该示例是 “使用客户端凭据保护API”,这是使用IdentityServer保护api的最基本场景.该示例涉及到三个项目包括:Identity ...

  3. C#动态调用泛型类、泛型方法

    在制作一个批量序列化工具时遇到了如下问题,在此记录一下,仅供参考. 主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用泛型类或泛型方法.控制台程序解决方案如下: Main工程:提供Wor ...

  4. 立即执行函数 IIFE

    立即执行函数表达式IIFE(Immediately-invoked function expression)我们知道,在javascript(ES5)中,是没有块级作用域的概念的.看一个例子 for ...

  5. 图解CSS3-flex布局

    前言 最近笔者在复习以前基础知识,发现很多细的知识点还是需要重新再总结一番.本文对flex布局进行图解说明,以后忘了的同学可以随时过来查看,欢迎转载,烦请注明出处. 主体 万丈高楼平地起,熟悉flex ...

  6. Android 启动优化

    对与Android的项目来说,app的启动速度是非常重要的.因为用户打开你的app给别人的第一体验就是打开软件的速度.但是app的启动速度是比较难以缩短的,因为一般来说开发者在app的启动入口都会创建 ...

  7. Android之OkHttp详解

    文章大纲 一.OkHttp简介二.OkHttp简单使用三.OkHttp封装四.项目源码下载   一.OkHttp简介 1. 什么是OkHttp   一般在Java平台上,我们会使用Apache Htt ...

  8. SQL Server移除事务日志后sys.master_files依然存在记录问题

    在SQL Server中移除了事务日志文件后,使用sys.master_files检查时发现,对应的事务日志文件记录信息依然存在sys.master_files里面,只是状态state_desc为OF ...

  9. 数组for循环查找范围

    数组for循环查找范围,如果是判读是否在键值之间,如$array[$i],那么接邻的元素不能用$array[$i+1]或者$array[$i-1]只能用$array[$i++]

  10. 关于Bulk加载模式

    Bulk加载模式是Informatica提供的一种高性能数据加载模式,它利用数据库底层机制,依靠调用数据库本身提供的Utility来进行数据的加载 该方式将绕过数据库的log记录,以此提高数据库加载性 ...