繁体   English   中英

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

[英]how are static arrays initialized in java if we are not creating any objects of that class

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

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

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

例如,这段代码:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM