Java中的方法可以拥有的最大参数数量是什么?为什么?
我在64位Windows系统上使用Java 1.8。
关于StackOverflow的所有答案都表明,技术限制为255个参数,但未指定原因。
确切地说,静态方法为255,非静态方法为254(this
在这种情况下为第255)。
我认为这可以用某种规范来描述,并且只允许静态定义最大数量的参数。
但这仅对 int
所有4字节类型有效。我使用long
参数进行了一些测试,在这种情况下,我只能声明127个参数。
使用String
参数时,我从测试中得出的允许数字为255(可能是因为Java中的参考大小为4个字节?)。
但是由于我使用的是64位系统,因此引用的大小应为8字节宽,因此使用String
参数时,与long
类型相似,最大允许数量应为127 。
如何精确应用此限制?
限制与方法的 堆栈大小 有关吗?
注意:我实际上不会在任何方法中使用这些许多参数,但是这个问题只是为了阐明确切的行为。
该限制在JVM规范中定义:
的方法的参数的数量 被限制为255 通过方法描述符(§4.3.3),其中该限制包括用于一个单位的定义 这 在实例或接口方法调用的情况下。
第4.3.3节提供了一些附加信息:
方法描述符仅在表示总长度小于或等于255的方法参数时才有效,其中该长度包括实例或接口方法调用时 对此 的贡献。
通过将各个参数的贡献相加来计算总长度, 其中long或double类型的参数对长度贡献两个单位,而其他类型的参数则贡献一个单位 。
您的发现很明显,双字原语(long
/ double
)需要两倍于通常的4字节变量 和4字节对象实例引用的大小 。
关于与64位系统有关的问题的最后一部分,规范定义了 一个参数贡献 多少个 单元 , 即使在64位平台上,该部分规范 仍必须遵守
,该64位JVM可以容纳255个实例参数(例如255个)Strings
),而不考虑内部对象的指针大小。
Java中的一个方法可以拥有的最大参数数是多少?为什么? 我正在64位Windows系统上使用Java1.8。 准确地说,255用于静态,254用于非静态(在本例中将是第255个)方法。 我认为这可以在某种规范中描述,并且只需要静态定义允许的最大参数数。 但这只对和所有4字节类型有效。我用参数做了一些测试,在那种情况下我只能声明127个参数。 限制与方法的堆栈大小有关系吗? 注意:我真的不打算在任
问题内容: 在方法内部声明局部内部类时,为什么包含最终的静态String或int是合法的,而包含其他对象却不合法? 例如: 编译时,得到以下信息: 为什么要区分?是因为String是不可变的吗?如果是这样,Integer.valueOf()也无效吗? 问题答案: 这是因为前两个静态成员分配给原始类型或String类型的编译时常量。 根据Java语言规范的第8.1.3节: 8.1.3。内部类和封闭实
带注释参数的Spring AOP切入点 如何基于带注释的参数编写方面切入点 AspectJ切入点表达式在任意位置匹配参数注释 考虑以下对setter方法的请求 我有以下内容,工作很好: 如何完成这个目标。有可能吗?我正在使用AspectJ 1.9.6
问题内容: 我写Java已有一段时间了,今天我遇到了以下声明: 请注意数组声明中的“点点点”,而不是通常的括号[]。显然可以。实际上,我写了一个小测试并验证了它的有效性。因此,我提取了Java语法,以查看参数声明语法的位置,但未找到任何内容。 那么对那里的专家来说,这是如何工作的呢?它是语法的一部分吗?另外,虽然我可以像这样声明函数,但不能像这样在函数体内声明数组。 无论如何,您知道在哪里记录了此
问题内容: 我知道Java中一个方法的最大大小为64k。如果超过该限制,我们将收到一个编译器警告,例如“代码太大而无法编译”。所以我们可以称这为Java的缺点吗? 我们可以增加这个大小限制,还是真的有可能增加? 关于此方法大小还有其他想法吗? 问题答案: 以我的经验,64KB的限制只是生成代码的问题。尤其是 初始化大型数组时(通过代码完成) 在结构良好的代码中,每种方法的长度都是可管理的,并且比此
问题内容: 我正在学习Java泛型,我问自己这个问题。 这两个方法声明之间有什么区别? 和 问题答案: 在后者中,您可以引用范围内的类型,即。在前者中,您不需要。