0 0

java的隐式变量0

我很好奇。比如
System.out.println(1+1);

这里的1+1并没有赋值给任何变量,
但是jdk内部是不是会默认赋值给一个我看不见的变量。
比如int rs = 1+1;

还是没有变量,只是在内存开辟一个空间,存储而已?
 
2014年11月04日 00:39

2个答案 按时间排序 按投票排序

0 0

采纳的答案

使用jdk自带的javap查看字节码:
源文件:
package com.an;

public class TestJavacVerbose
{
public static void main(String[] args)
{
System.out.println(1+1);
}
}

cmd下运行:
E:\anWorkSpace\pra_test\src\main\java\com\an>javap -c TestJavacVerbose
Compiled 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:   return

public 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文件中时它只是占用了一点点字节来存储。
结论:没有你说的变量,只是占用了一点空间存储了这个编译期就明确的常量而已。几乎所有编译期就能确定的内容都是这样的。

2014年11月04日 16:25
0 0

应该不会的,目前的JDK会把1+1优化为2(在编译期间就会变成2)。 其中2实际上是保存在常量区的,每个Class会分配一个const pool。

如果是system.out.println(a+b),也不会生成一个临时变量的,因为Java解释器实际上是栈式的方式进行解释。编译器会生成类似于如下的指令:

push a
push b
add
(实际的指令不是这样的,比如整数相加和double相加的指令是不同的,但是类似)

Push即压栈指令,最后生成一个Add指令,这样JVM在解释执行的时候,在解释add时,a和b已经在栈里面了。就做了a+b操作,操作好了之后再回写到栈区。

如果是c=a+b则会多一个类似于load指令,将栈区的数据读到变量c里面。

2014年11月04日 08:08

相关推荐

    [Java4Android 04_Java的变量

    Java支持数据类型的自动转换(隐式转换),比如从int到long,但不支持从char到int的隐式转换。强制类型转换(显式转换)需要使用括号,如`(int)doubleValue`。 总结,理解和熟练运用Java的变量是编程的基础,它...

    Java中的隐式参数和显示参数实例详解

    `这行代码中,`a`实际上是指`this.num`,因为`a`在这里是一个未声明的变量,所以Java会查找当前对象的成员变量`num`。这里`this`虽未明确写出,但它是隐含存在的,代表`Test`类的实例。 总的来说,理解Java中的显式...

    java --this变量

    `this`在Java中是一个隐式传递的引用,它指向调用方法或构造器的那个对象实例。当你在一个类的方法内部使用`this`时,它指代的就是当前方法所属的对象实例。例如: ```java public class Person { private String ...

    javascript 显示全局变量与隐式全局变量的区别

    不使用 var 声明的隐式全局变量 两者的区别在于是否能通过 delete 操作符删除 先看一段代码 var a = 'a'; // 显式声明的全局变量 b = 'b'; // 隐式声明的全局变量 console.log(a); // a console.log(b); // b ...

    EL表达式 隐式对象

    除了访问属性之外,EL还可以调用 Java 类中的公共静态方法。为了实现这一点,需要在 TLD 文件中声明方法对应的 `&lt;function&gt;` 元素,并指定方法的全限定名、方法签名等信息。例如: ```xml ``` 在 JSP 页面中使用时...

    java常见面试题(史上最全最经典-希望对你有用)

    switch语句只能作用于int基本类型或Integer包装类型,byte、short、char类型可以隐式转换为int类型,但是long和String类型都不符合switch语句的语法规定。 5. 变量和数据类型 * short s1 = 1; s1 = s1 + 1;有什么...

    java数据类型、变量、数组.pdf

    与C或C++不同,Java不允许隐式的类型转换,比如浮点型值直接赋给整型变量,也不允许参数和自变量之间缺乏强制的类型检查。 Java提供了8种简单的或基本的数据类型,它们分为四组:整数类型、浮点类型、字符类型和...

    JAVA个人学习笔记

    JAVA学习笔记是面向对象编程语言的学习笔记,涵盖了JAVA的基本概念、面向对象编程思想、类和对象的概念、实例变量和局部变量的区别、方法的定义和调用、类型转换、精度问题、移位问题、switch语句的使用等内容。...

    java工程师找工作中面试遇到的专业知识问题总结.pdf

    本文总结了 Java 工程师找工作中面试遇到的专业知识问题,涵盖了 Java 的基本概念、Spring 框架、Java 变量、Java 方法、Java 类、JQuery 事件绑定等方面的知识点。 一、Java 基本概念 * Java 变量:包括基本类型...

    Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释.doc

    ### Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释 #### 背景介绍 在Java编程语言中,局部内部类(Local Inner Class)是一种特殊的内部类形式,它被定义在某个方法或构造器的内部。...

    JAVA程序设计课件-变量的类型转换.pptx

    1. 自动类型转换,也称为隐式类型转换,是Java编译器自动完成的过程。这种转换只会在两种数据类型兼容且目标类型的取值范围大于源类型时发生。例如: - 整数类型间的转换:byte -&gt; short -&gt; int -&gt; long - 整数到...

    通过字节码看java中this的隐式传参详解

    this关键字的隐式传参是指在方法调用时,Java虚拟机(JVM)会自动将当前对象的引用传递给方法,因此在方法中可以使用this关键字来访问当前对象的成员变量。 静态方法与非静态方法的区别 在Java语言中,静态方法和...

    Java基础语言的笔记

    配置环境变量通常包括设置JAVA_HOME变量指向JDK的安装目录,并将JDK的bin目录添加到系统的Path变量中。 3. Java程序入门 Java程序由源代码组成,源代码文件通常以“.java”结尾。源代码通过编译器转化为字节码,...

    “java高分面试指南”-25分类227页1000+题50w+字解析.pdf

    Java高分面试指南是一个涵盖Java相关知识的综合指南,涵盖了Java基础知识、Java开发平台、Java语言特点、面向对象编程、数据结构、Java数据类型、标识符命名规则、instanceof关键字、隐式转换和显式转换等多方面的...

    Java实验-基本数据类型及操作

    1. 隐式类型转换:隐式类型转换是指Java自动将一种数据类型转换为另一种数据类型的过程,例如将int类型转换为double类型。 2. 显示类型转换:显示类型转换是指使用强制类型转换符号将一种数据类型转换为另一种数据...

    山大JAVA试题

    * 赋值语句需要注意数据类型的转换问题,例如将整型数据赋值给浮点型变量需要进行隐式类型转换。 知识点5:switch语句 * Java中的switch语句可以根据不同的case值执行不同的语句。 * switch语句需要注意break语句...

    java初级程序员知识笔记

    Java中有两种类型的变量:实例变量和局部变量。实例变量是属于对象的成员变量,用于存储对象的状态。局部变量是方法内部的变量,用于存储临时数据。Java中的方法可以是静态的,也可以是实例方法。静态方法属于类,而...

    Java笔记总结.pdf

    Java语言中有多种类型转换,包括强制类型转换和隐式类型转换。强制类型转换可以将一种类型的变量转换成另一种类型的变量,但可能会丢失精度。在使用强制类型转换时,需要小心地处理可能的精度丢失问题。 Java语言中...

    java期末复习题.doc

    ,因为 char 类型的变量可以隐式地转换为 int 类型。 赋值语句 Java 中的赋值语句中合法的是 B) ++ i;,因为它正确地使用了自增运算符。 变量定义语句 Java 中的变量定义语句中合法的是 C) double a =10000;,...

    VaalCalc:流放之路的工具,可帮助您计算滚动不同的vaal隐式变量的机会

    为了帮助玩家更准确地预测和决策,出现了名为“VaalCalc”的工具,它是一款专门用于计算瓦尔隐性变量概率的实用程序。 VaalCalc的核心功能在于模拟瓦尔宝石的滚动过程,分析不同类型的装备和瓦尔宝石组合下可能出现...

Global site tag (gtag.js) - Google Analytics