很对不起作者,当时看到这篇文章的时候因为有事情忙,所以直接拷贝发到邮箱,这个时候转出来,就找不到出处了,如果哪位找到出处给我留个言,我把出处补上。谢谢
i=0;i=
i++为什么等于0这个问题困扰了我好长的一段时间<wbr>,结果前段时间还试图从虚拟机那个层面进行解释,但无论是线程还是<wbr>方法调用都不能解释其现象,发现方向性错误,这只是一个语言的特性<wbr>而已。在java lang spec中提到:
1、java运算符的优先级++符是大于=的。
2、The result of the postfix increment expression is not a variable, but a value.后++符表达式的结果是个值而不是一个变量。
也就是说后++符先将自己的值存储起来,然后对变量进行++;
再进行赋值操作,也就是将先存储起来的值赋给变量i<wbr>,这样的操作就导致了i值被置为0了</wbr>
对于C和C++来说不一样,在讲到m=i++操作时<wbr>,C语言是先将i的值赋给了m,然后将i值++,这样i=i+<wbr>+的结果自然就是1了,c的实现中是不存在那个中间的值的存储的。</wbr></wbr>
由于java和c不同的语言特性,导致了i=i++的不同之处<wbr>,前面的笔记中已经提到,由于java lang spec中的一些细微规定,导致其运行结果的不同<wbr>,我们可以用个例子来看i=i++在jvm中实际的运行过程。
源程序test.java:
public class test {
public test() {
}
public static void main(String[] args) {
int i=0;
i=i++;
}</wbr></wbr>
}
我们用javap来看其实际的虚拟机指令集:
C:\JBuilderX\jdk1.4\bin>javap -c -classpath "d:/" test
Compiled from "test.java"
public class test extends java.lang.Object{
public test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: nop
5: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 //常数0入栈
1: istore_1 //i赋值,常数值出栈
//至此完成i=0;
2: iload_1 //装载变量i,0入栈
//第2步是特殊的一步,这步将i值先行保存,以备赋值使用
3: iinc 1, 1 //变量值增加,栈内值不变
//至此完成i++
6: istore_1 //i赋值,0出栈。
//至此完成i=i++
7: nop //donothing
8: return
}
对比而言,对于i++而言,i=i++指令多了两步,2和6
其实这两步是赋值符号引起的,有意思的是第二步出现的时机<wbr>,是在iinc之前,这就是因为java lang spec中规定的。</wbr>
</wbr></wbr></wbr>
分享到:
相关推荐
在Java编程领域,开发者经常需要对已有的字节码文件(.class)进行反编译,以便理解其内部实现逻辑或进行二次开发。...在实际开发中,合理利用此类工具可以提高工作效率,解决某些特定场景下的问题。
Java字节码转换工具Retrotranslator是一个用于解决软件兼容性问题的实用工具,尤其是在Java版本升级带来的不兼容性上。随着Java技术的不断迭代,新版本的特性常常不能在旧版本的JDK环境下运行,而Retrotranslator的...
Java 编译器不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。...
在Java中,字节码(Bytecode)是程序经过编译后的中间表示,可以直接由Java虚拟机(JVM)执行。由于字节码是明文的,如果直接暴露,可能会导致知识产权泄露,因此对其进行加密至关重要。 字节码加密通常包括以下几...
标题《轻松看懂Java字节码.pdf》中隐藏的知识点是理解Java字节码的重要性及如何轻松掌握。描述中提到Java字节码是实现“一次编写,到处运行”(Write Once, Run Anywhere)这一Java承诺的核心技术之一。而标签“Java...
Java字节码优化框架,如Soot,是用于提升Java程序性能的重要工具。Soot作为一个独立的工具,能够对Java字节码进行优化和检查,同时也为开发者提供了一个框架,以便于在字节码级别设计和实现优化策略。这个框架支持...
Java字节码编辑器是一种工具,它允许开发者直接编辑Java程序编译后的`.class`文件,而不是反编译后再重新编译。...通过熟练掌握字节码编辑,开发者可以更高效地优化代码、解决问题,甚至探索新的编程模式。
javap 可以将类文件(.class)中的字节码反编译成 Java 源代码的形式,打印出类中的公共域、方法、构造函数和静态初始值。 javap 的用法语法为:javap <选项> <类名>,其中选项包括: * -b:向后兼容 JDK 1.1 中的...
在本文中,我们将深入探讨如何使用JD-GUI来查看和理解Java字节码文件。 首先,JD-GUI的直观用户界面使得查看.class文件变得简单。只需将包含.class文件的目录或单个.class文件直接拖放到工作框内,工具就会自动解析...
Java字节码是Java程序在运行时被JVM(Java虚拟机)解释执行的一种中间语言。每个Java类都由一个`.class`文件表示,其中包含了编译后的字节码指令。`.class`文件的结构非常严谨,它不仅包含了类的信息,如类名、方法...
Java字节码分析工具,系统分析了java字节码文件,即java class类文件,对该文件中的各种成分以树的形式描述出来,只能针对未加密的class文件,一般由标准java编译器编译生成的class文件都未加密,该系统在vs2003下面...
在Java编程中,源代码首先被Java编译器转化为字节码。例如,以下简单的Java源码: ```java package com.april.test; public class Demo { private int num = 1; public int add() { num = num + 2; return ...
Java字节码是Java编程语言的一个重要特性,它在Java程序执行过程中扮演着核心角色。本文将深入探讨Java字节码的基本概念、作用以及其在Java虚拟机(JVM)中的运行机制。 Java字节码是一种低级的、平台无关的指令集...
在Java中,AOP通常通过代理模式和字节码操作来实现,如Spring AOP就是其中的典型代表。本文将深入探讨如何利用字节码技术实现AOP。 首先,理解字节码是关键。Java源代码编译后生成的是字节码(.class文件),这是...
**JAVA字节码操作库 BCEL** BCEL(Byte Code Engineering Library)是Java开发的一个重要工具,主要用于处理Java字节码。它为开发者提供了一种深入理解与操作Java类文件的底层机制,允许分析、创建、修改和优化字节...
Java字节码反编译是Java开发者在进行代码分析、逆向工程或学习...通过理解字节码和掌握反编译工具,我们可以深化对Java程序的理解,提高解决问题的能力。然而,也应尊重软件的知识产权,只在合法范围内使用反编译技术。
"字节码实战"的主题深入探讨了字节码的概念、生成以及如何利用它来优化Java应用程序。下面将详细阐述相关知识点。 1. **字节码简介**: 字节码是Java源代码经过编译器编译后的中间表示形式,它是一种平台无关的二...
在Java开发中,ASM库允许我们直接操作字节码,这对于理解和实践AOP(面向切面编程)的概念尤其有用,就像Spring框架中的AOP实现。 面向切面编程(AOP)是一种编程范式,它允许程序员定义“切面”,这些切面封装了...
常量池是 Java 字节码文件中的一种数据结构,它存储了 Java 字节码文件中的常量信息。常量池的结构主要包括常量池的大小、常量池的索引、常量池的内容等。在本例中,常量池的大小为 27 个。 访问标识符(Access ...