我可以在JVM文档中读到以下内容:
所有8字节常量占用类文件的constant_pool表中的两个条目。如果CONSTANT_Long_info或CONSTANT_Double_info结构是索引n处的constant_pool表中的项,则池中的下一个可用项位于索引n + 2处。 constant_pool索引n + 1必须有效,但被认为是不可用的。
回想起来,制作8字节常量需要两个常量池条目 是一个糟糕的选择。
如果索引n + 1有效,它怎么会“无法使用”?此外,它似乎并不完全无法使用,因为它可以存储一个值:
long或double类型的值占用两个连续的局部变量。只能使用较小的索引来处理这样的值。例如,存储在索引n的局部变量数组中的double类型的值实际上占用索引为n和n + 1的局部变量;但是,无法加载索引n + 1处的局部变量。它可以存储到。但是,这样做会使局部变量n的内容无效。
这是否意味着“有效”=“你可以存储到它”,“无法使用”=“你无法加载它”?
答案 0 :(得分:2)
您正在混合常量池和局部变量。
关于恒定池的第一个引用,顾名思义,它是恒定的。您无法存储到常量池中。短语“ constant_pool索引n + 1必须有效”意味着,例如,如果池的最后一个条目是long
或double
常量,那么您仍然必须声明池足够大以容纳两个条目,尽管第二个不可用。我不知道任何其他实际后果,因此它主要是一个正式声明,暗示存在一系列连续的有效指数,尽管其中一些指数无法读取。
第二个引用的局部变量是另一回事。可以写入局部变量,并且写入的值不需要与前一个相同,唯一的要求是后续读取适用于当前变量类型,即最近写入的值。因此,即使先前在 n 处有long
或double
类型的值,您也可以写入 n +1索引,但这意味着之后 n 没有有效值,只有 n +1时的新值。