как статические массивы инициализируются в Java, если мы не создаем объекты этого класса - PullRequest
0 голосов
/ 30 марта 2019

У меня есть статический массив в качестве члена данных класса, и у меня есть все статические функции, поэтому я не создаю никаких объектов, поэтому в этом случае не вызываю конструктор, как инициализируется мой статический массив и с чем?

1 Ответ

0 голосов
/ 30 марта 2019

Тип поля, статический или экземпляр, не имеет ничего общего с созданием объекта - это ортогональные понятия.

Все «статические» означают, что поле является полем класса, в то время как нестатические поля являются полями экземпляра, и если поле, будь то статическое или экземплярное, является справочным (не примитивным) полем, и если они не являются полями - ну, тогда объект, на который они ссылаются, был создан где-то где-то.

Например, этот код:

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;
...