Тип поля, статический или экземпляр, не имеет ничего общего с созданием объекта - это ортогональные понятия.
Все «статические» означают, что поле является полем класса, в то время как нестатические поля являются полями экземпляра, и если поле, будь то статическое или экземплярное, является справочным (не примитивным) полем, и если они не являются полями - ну, тогда объект, на который они ссылаются, был создан где-то где-то.
Например, этот код:
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;