[英]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.