首页 > 解决方案 > 如果我们不创建该类的任何对象,如何在 java 中初始化静态数组

问题描述

我有一个静态数组作为类的数据成员,并且我拥有所有静态函数,所以我没有创建任何对象,因此在这种情况下不调用任何构造函数我的静态数组是如何被初始化的?

标签: javaarraysstaticinitialization

解决方案


字段的类型,静态或实例,与对象创建无关——它们是正交概念。

所有“静态”意味着该字段是类字段,而非静态字段是实例字段,并且如果该字段,无论是静态的还是实例的,都是引用(非原始)字段,并且如果它们是非空的,然后他们所指的对象已经以某种方式在某处创建。

例如,这段代码:

package pkg2;

public class Foo {
    String[] instanceArray = {"A", "B", "C"};
    static String[] staticArray = {"A", "B", "C"};
}

生成此字节码:

public class pkg2.Foo {
  java.lang.String[] instanceArray;

  static java.lang.String[] staticArray;

  static {};
    Code:
       0: iconst_3
       1: anewarray     #11                 // class java/lang/String
       4: dup
       5: iconst_0
       6: ldc           #13                 // String A
       8: aastore
       9: dup
      10: iconst_1
      11: ldc           #15                 // String B
      13: aastore
      14: dup
      15: iconst_2
      16: ldc           #17                 // String C
      18: aastore
      19: putstatic     #19                 // Field staticArray:[Ljava/lang/String;
      22: return

  public pkg2.Foo();
    Code:
       0: aload_0
       1: invokespecial #24                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: iconst_3
       6: anewarray     #11                 // class java/lang/String
       9: dup
      10: iconst_0
      11: ldc           #13                 // String A
      13: aastore
      14: dup
      15: iconst_1
      16: ldc           #15                 // String B
      18: aastore
      19: dup
      20: iconst_2
      21: ldc           #17                 // String C
      23: aastore
      24: putfield      #26                 // Field instanceArray:[Ljava/lang/String;
      27: return
}

显示两个数组对象的创建方式相同,但存储方式不同

具体来说——两个数组对象的创建方式相同:

   5: iconst_3
   6: anewarray     #11                 // class java/lang/String
   9: dup
  10: iconst_0
  11: ldc           #13                 // String A
  13: aastore
  14: dup
  15: iconst_1
  16: ldc           #15                 // String B
  18: aastore
  19: dup
  20: iconst_2
  21: ldc           #17                 // String C
  23: aastore

但存储方式不同:

对于实例字段:

  24: putfield      #26                 // Field instanceArray:[Ljava/lang/String;

对于静态字段:

  19: putstatic     #19                 // Field staticArray:[Ljava/lang/String;

推荐阅读