java的隐式变量

问题描述

我很好奇。比如System.out.println(1+1);这里的1+1并没有赋值给任何变量,但是jdk内部是不是会默认赋值给一个我看不见的变量。比如int rs = 1+1;还是没有变量,只是在内存开辟一个空间,存储而已?

解决方案

使用jdk自带的javap查看字节码:源文件:package com.an;public class TestJavacVerbose{public static void main(String[] args){System.out.println(1+1);}}cmd下运行:E:anWorkSpacepra_testsrcmainjavacoman>javap -c TestJavacVerboseCompiled from "TestJavacVerbose.java"public class com.an.TestJavacVerbose extends java.lang.Object{public com.an.TestJavacVerbose(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: returnpublic static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: iconst_2 4: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 7: return}注意倒数第四行:iconst_2就是说把常量2放入栈中。也就是说2是放在class文件的常量池中的,再具体说就是类加载器加载class文件的时候,才把这个2放到方法区的常量池中,在class文件中时它只是占用了一点点字节来存储。结论:没有你说的变量,只是占用了一点空间存储了这个编译期就明确的常量而已。几乎所有编译期就能确定的内容都是这样的。
解决方案二:
应该不会的,目前的JDK会把1+1优化为2(在编译期间就会变成2)。 其中2实际上是保存在常量区的,每个Class会分配一个const pool。如果是system.out.println(a+b),也不会生成一个临时变量的,因为Java解释器实际上是栈式的方式进行解释。编译器会生成类似于如下的指令:push apush badd (实际的指令不是这样的,比如整数相加和double相加的指令是不同的,但是类似)Push即压栈指令,最后生成一个Add指令,这样JVM在解释执行的时候,在解释add时,a和b已经在栈里面了。就做了a+b操作,操作好了之后再回写到栈区。如果是c=a+b则会多一个类似于load指令,将栈区的数据读到变量c里面。

时间: 2024-09-14 22:25:33

java的隐式变量的相关文章

J2EE探索者:隐式对象的多种用法

j2ee|对象 接着上月对会话作用域的介绍,企业 Java 专家 Kyle Gabhart 深入研究了 JSP 隐式对象的多种用法.接下来,他将介绍 9 个隐式对象,解释每个对象的用途(或者多种用途),最后给出一些怎样在 JSP 编程中使用这些便利工具的最佳实践.您可以到我们的 讨论论坛 中分享您对这篇文章或者 J2EE 探索者 系列中的任何其他文章的想法. 本期的 J2EE探索者 是上个月的 正确处理会话作用域入门 的续篇.除了访问会话作用域之外,JSP 隐式对象还可以用来处理 HTML 参数

简单谈谈javascript中this的隐式绑定_基础知识

我们先来看一个例子 function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; obj.foo(); // 2 this指向了obj,因为foo执行时的call-site(可以理解为调用时所在作用域)在obj上面.注意是运行的时候,和在哪里声明的没有关系. call-site and call-stack call-site姑且理解为调用域,call-stack为调用栈.如下代码可以辅助我们理解 function

简单介绍JavaScript数据类型之隐式类型转换_javascript技巧

JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object.object是引用类型,其它的五种是基本类型或者是原始类型.我们可以用typeof方法打印来某个是属于哪个类型的.不同类型的变量比较要先转类型,叫做类型转换,类型转换也叫隐式转换.隐式转换通常发生在运算符加减乘除,等于,还有小于,大于等.. typeof '11' //string typeof(11) //number '11' < 4 //false 本章节单

Java基础之隐式转换vs强制转换_java

Java中,经常可以遇到类型转换的场景,从变量的定义到复制.数值变量的计算到方法的参数传递.基类与派生类间的造型等,随处可见类型转换的身影.Java中的类型转换在Java编码中具有重要的作用. 在定义变量时,有许多要注意的问题,一不小心就会出现损失精度或者不兼容类型等问题. 例如:     1.定义长整型数据时,必须加后缀l或L               long l =123456789012345L     2.定义单精度类型时(7-8位有效数字),必须加后缀 f 或 F         

从Java的类型转换看MySQL和Oracle中的隐式转换(二)

说起数据类型转换,在开发中如此,在数据库中也是如此,之前简单对比过MySQL和Oracle的数据类型转换情况,可以参见MySQL和Oracle中的隐式转换 http://blog.itpub.net/23718752/viewspace-1787973/ 不过当时写完之后,有个读者随口问了一句为什么,为什么呢?似乎自己还是一知半解,说是规则,无规矩不成方圆,倒也无可非议,不过我觉得还是要再看看,看看还能有哪些收获,接下来的内容我就不能保证正确性了,希望大家明辨,也希望提出意见,毕竟就是希望把问题

var与Javascript变量隐式声明_javascript技巧

var x = "XX"; y ="xxx"; 诸如此类.这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于"隐式"声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现. 除此之外,今天通过同事介绍,了解到这种"隐式声明"中的别外一个问题. 当你在当前上下文内进行这种"隐式"声明时,JavaScript引擎会先在当前上下文中寻

ORACLE绑定变量隐式转换导致性能问题

   年后一次系统升级后,监控数据库的工具DPA发现数据库的Total Wait时间突然飙增,如下截图所示,数据库的总体等待时间对比升级前飙增了非常多 另 外就是发现出现了较多的等待事件,主要有latch: cache buffers chains. latch: shared pool .db file scattered read.根据这边的监控发现TOP SQL里面从升级前的0次变为了一天的一万多次(有些甚至更多),分析过后我们就找开发人员了解一下系统升级变跟的内容和改动 开 发人员坚定的

Javascript var变量隐式声明方法_javascript技巧

诸如此类.这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于"隐式"声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现. 除此之外,今天通过同事介绍,了解到这种"隐式声明"中的别外一个问题. 当你在当前上下文内进行这种"隐式"声明时,JavaScript引擎会先在当前上下文中寻找是否之前有声明此变量,如果没有,再到上一级的上下文中去寻找,如果一直未找到,会最后在w

C#教程:匿名类型和隐式类型变量的区别

隐式类型变量 (Implicitly typed local variables) 象下面的代码书写就是隐式类型变量 var i = 5; var str = "Csharp" var numbers = new int[]{1,2,3}; var orders = new System.Collections.Hashtable(); var orders1 = new Dictionary(); var i = xxx ; 的作用就是用 xxx 的类型声明为i的类型.并给i 赋值.