首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个Java方法可以有超过255个局部变量吗?

一个Java方法可以有超过255个局部变量吗?
EN

Stack Overflow用户
提问于 2012-12-25 06:10:36
回答 2查看 694关注 0票数 6

LVA操作码用于将一个值从局部变量数组( iload )推送到操作数堆栈上。

此操作码接受单个字节作为参数(en.wikipedia.org/wiki/Java_bytecode_instruction_listings),该参数用作LVA的索引。

如果LVA的一个元素总是对象的引用(我猜静态方法不是这种情况,但现在先忽略这些),如果恰好有一个字节被用作索引(256个可能的值),那么一个方法如何能够访问超过255个不同的局部变量呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-25 06:14:38

是的,Java方法可以有超过255个局部变量。wide操作码指令可用于修改iloadaload指令,使其使用16位索引而不是8位索引,这意味着只要最终使用wide操作码,函数中就可以有多达65536个不同的局部变量。

也就是说,注意Java局部变量不一定与JVM局部变量一一对应。Java编译器可能会查看您的代码,注意局部变量的空间可以在某些上下文中重用,然后将多个Java局部变量映射到相同的JVM局部变量。

希望这能有所帮助!

票数 17
EN

Stack Overflow用户

发布于 2012-12-25 06:19:26

我为您编写了一个包含300个本地变量的程序,对此进行了尝试。这段代码:

代码语言:javascript
复制
System.out.println(a255);
System.out.println(a256);

编译成这样:

代码语言:javascript
复制
3575: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;
3578: iload         255
3580: invokevirtual #53                 // Method java/io/PrintStream.println:(I)V
3583: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;
3586: iload_w       #256                // Utf8 a196
3590: invokevirtual #53                 // Method java/io/PrintStream.println:(I)V

注意:使用Eclipse和javac编译,结果完全相同。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14026053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档