You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在传递至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:37:03