java - 如果我们不创建该类的任何对象,如何在 java 中初始化静态数组
问题描述
我有一个静态数组作为类的数据成员,并且我拥有所有静态函数,所以我没有创建任何对象,因此在这种情况下不调用任何构造函数我的静态数组是如何被初始化的?
解决方案
字段的类型,静态或实例,与对象创建无关——它们是正交概念。
所有“静态”意味着该字段是类字段,而非静态字段是实例字段,并且如果该字段,无论是静态的还是实例的,都是引用(非原始)字段,并且如果它们是非空的,然后他们所指的对象已经以某种方式在某处创建。
例如,这段代码:
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;
推荐阅读
- python - 我无法弄清楚我在这里失败了哪些测试用例
- javascript - 为什么单击按钮时相关节点的子节点不会删除?
- c# - 如何更改 AJAX 条形图中文本的颜色?
- javascript - 如何在javascript中将多个属性导入到一个对象中?
- kubernetes - Kubernetes 通过 minicube 中的 DNS 名称公开应用程序
- c# - 使用 Linq 查询语法在 C# 中使用实体框架搜索 XML 数据类型列
- javascript - 在注册时检查电子邮件是否已存在于 firestore auth (Angular)
- html - 为什么我的 ::before 元素仅在我使用绝对位置时才显示?
- javascript - 根据单选选择添加 HTML 表单的操作
- python - 为什么我的 Python 机器人有时会多次发帖?