java中的数组长度属性

时间:2014-06-20 21:00:21

标签: java arrays initialization final

请不要介意这只是一个关于数组长度属性的简单问题。 作为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

如何以及何时初始化(运行时/编译时)?

2 个答案:

答案 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指令如何创建引用数组,并显示了类似的模式。