如果我们不创建该类的任何对象,如何在Java中初始化静态数组

时间:2019-03-30 16:42:55

标签: java arrays static initialization

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

1 个答案:

答案 0 :(得分:0)

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

所有“静态”是指该字段是类字段,而非静态字段是实例字段,并且如果该字段是静态字段还是实例,则是引用(非原始)字段,并且如果它们不是-null,则它们所引用的对象已经以某种方式在某处创建。

例如,此代码:

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;