iteye_17041 2014-11-04 00:39
浏览 245
已采纳

java的隐式变量

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

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

还是没有变量,只是在内存开辟一个空间,存储而已?

  • 写回答

2条回答 默认 最新

  • iteye_12702 2014-11-04 16:25
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了