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