3 回答
TA贡献1780条经验 获得超5个赞
它不是JLS 15.28意义上的编译时常量表达式。
表达式str.length()
是一个方法调用,没有显式的方法调用是常量表达式。即使 String 是文字也是如此;ie"hello".length()
不是根据 JLS 的编译时常量表达式。
它是一个运行时常量,从某种意义上说,一旦String
被创建,长度就不能改变。这是因为 Java 字符串是不可变的。
您可以通过查看(标准)String
类的任何版本的源代码来确认这一点。代码可能会因版本而异,但“运行时恒定性”属性在所有版本中都将保持不变。
(其实上面说的并不完全准确,如果你愿意用坏反射来破坏封装,你可以修改 a 的私有成员String
并对其进行变异。这样可以改变 返回的值length()
。你可以通过 native 达到同样的效果代码方法,可能还有其他方法。但是......只是......不要这样做!JLS 说如果你这样做,你的 Java 代码的行为是未指定的。)
TA贡献1895条经验 获得超3个赞
根据源代码的(jdk9)String类,length():
public int length() {
return value.length >> coder();
}
哪里value是
@Stable
private final byte[] value;
并且coder()是:
byte coder() {
return COMPACT_STRINGS ? coder : UTF16;
}
所以它本质上是一个运行时常量,因为String's 是不可变的,并且 的长度value将在编译时决定。
添加回答
举报