如何在传递至Main类前计算NewClass1的全局静态数组d?
关于Java静态数组初始化与执行顺序的问题解答
一、你的推测不完全准确,核心问题解析
你看到NewClass1.d.length输出1,根本原因不是b未完成初始化,而是**d本身是一个二维数组,它仅包含一个元素(即数组b),所以它的长度是1**。而数组b在类加载阶段就已经被初始化为长度为5的数组了——哪怕它内部元素还没被赋值,length属性已经固定为5。如果你想获取b的长度,应该写NewClass1.d[0].length,此时输出就是你预期的5。
二、让b的元素在Main访问前完成赋值的方案
你当前给b元素赋值的逻辑写在NewClass1的main方法里,但这个方法只有直接运行NewClass1类时才会执行。当你运行Main类时,NewClass1的main方法不会被触发,所以b里的元素还是默认的0值。
要让b的元素在类加载阶段就完成赋值,把赋值逻辑放到静态代码块里即可:
import java.util.*; public class NewClass1 { public static int[] a = { 1, 2, 3, 4, 5 }; public static int[] b = new int[5]; public static int[] d[] = { b }; // 静态代码块,类加载时自动执行 static { for (int c = 0; c < a.length; c++) { b[c] = a[c] + 7; } } public static void main (String[]args) { System.out.println ("TEST"); System.out.println ("New numbers: " + Arrays.toString (b)); } }
这样当Main类访问NewClass1的静态成员时,NewClass1会被加载,静态代码块自动执行,b的元素就已经完成计算赋值。
补充:Java静态成员的初始化顺序
静态变量和静态代码块的执行顺序严格遵循它们在类中的定义顺序:
- 先初始化
a数组 - 再初始化
b为长度5的空数组 - 再初始化
d为包含b的二维数组 - 最后执行静态代码块,给
b的元素赋值
此时不管访问a.length、b.length还是d[0].length,结果都是5,同时b内部的元素也已经是计算后的值。
内容的提问来源于stack exchange,提问作者Quest
相关产品推荐
相关产品推荐

