请不要介意这只是一个关于数组长度属性的简单问题。 作为Java的初学者,我遇到了Constants和final关键字,它被描述为:
常量是不可修改的变量,使用关键字final声明。在程序执行期间,它们的值无法更改。此外,必须在声明期间初始化常量。例如:
final double PI = 3.1415926; // Need to initialize
我已阅读了几乎所有相关帖子,但我对其初始化感到困惑。 我曾尝试使用Netbeans IDE深入研究它的类,但它的实现在那里看不到。
获取数组长度的长度字段怎么样?
http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.7
如何以及何时初始化(运行时/编译时)?
答案 0 :(得分:4)
实际上这是一个非常好的问题!
这需要深入了解编译器的工作原理。我花了很多时间编写C语言编译器。
它的工作原理是在编译期间由编译器的前端对常量进行类型检查。在确定标识符的其他属性的情况下,这可以确保它们是预期的类型并在预期的范围内。
现在,大多数编译器具有与它们相关联的多令牌预测(除了早期语言之外的所有语言都具有此功能)。这是如何工作的,在编译期间,“' ['和']'括号通过编译器的前端进行语法和语法分析,以确保它在编译期间是有效的并且是已知的。
在java运行时环境中,数组的长度字段位于类/方法区域中,因此直到运行时才会初始化。
答案 1 :(得分:1)
来自Java Virtual Machine Specification. Chapter 3. Compiling for the Java Virtual Machine. 3.9 Arrays:
Java虚拟机阵列也是对象。使用一组不同的指令创建和操作数组。
newarray
指令用于创建数字类型的数组。代码:void createBuffer() { int buffer[]; int bufsz = 100; int value = 12; buffer = new int[bufsz]; buffer[10] = value; value = buffer[11]; }
可能编译为:
Method void createBuffer() 0 bipush 100 // Push int constant 100 (bufsz) 2 istore_2 // Store bufsz in local variable 2 3 bipush 12 // Push int constant 12 (value) 5 istore_3 // Store value in local variable 3 6 iload_2 // Push bufsz... //line below is what you're looking for [comment is mine] 7 newarray int // ...and create new int array of that length 9 astore_1 // Store new array in buffer 10 aload_1 // Push buffer 11 bipush 10 // Push int constant 10 13 iload_3 // Push value 14 iastore // Store value at buffer[10] 15 aload_1 // Push buffer 16 bipush 11 // Push int constant 11 18 iaload // Push value at buffer[11]... 19 istore_3 // ...and store it in value 20 return
newarray int
指令初始化数组及其长度。这意味着在初始化数组时初始化数组长度,在运行时。
上面链接的解释也解释了anewarray
指令如何创建引用数组,并显示了类似的模式。