Kapan bidang statis diinisialisasi? Jika saya tidak pernah membuat instance kelas, tetapi saya mengakses bidang statis, apakah SEMUA blok statis dan metode statis pribadi yang digunakan untuk membuat instance bidang statis pribadi dipanggil (dalam urutan) pada saat itu juga?
Bagaimana jika saya memanggil metode statis? Apakah itu juga menjalankan semua blok statis? Sebelum metode?
java
static
initialization
Tony R
sumber
sumber
Jawaban:
Inisialisasi statis kelas biasanya terjadi segera sebelum pertama kali salah satu peristiwa berikut terjadi:
untuk kelas tingkat atas, pernyataan assert yang secara leksikal bertumpuk di dalam kelas dijalankan1 .Lihat JLS 12.4.1 .
Dimungkinkan juga untuk memaksa kelas untuk menginisialisasi (jika belum diinisialisasi) dengan menggunakan
Class.forName(fqn, true, classLoader)
atau bentuk singkatClass.forName(fqn)
1 - Poin terakhir ada di JLS untuk Java 6 hingga Java 8, tetapi tampaknya ada kesalahan dalam spesifikasi. Itu akhirnya diperbaiki di Java 9 JLS: lihat sumber .
sumber
String
s diganti dan tidak direferensikan. Jika Anda mereferensikan aclass Other { public static final int VAL = 10; }
dari beberapa kelasMyClass { private int = Other.VAL; }
, kelasOther
tersebut tidak akan dimuat. Sebaliknya, kompilator hanya akan mengganti bidang terakhir pada waktu kompilasi.String
variabel 'final statis' , hanya variabel yang diinisialisasi oleh ekspresi konstan.static
sementara ini kasus umum.Bidang statis diinisialisasi selama "fase" inisialisasi pemuatan kelas (pemuatan, penautan, dan inisialisasi) yang mencakup inisialisasi statis dan inisialisasi bidang statisnya. Penginisialisasi statis dijalankan dalam urutan tekstual seperti yang ditentukan di kelas.
Perhatikan contohnya:
Test.b mencetak
null
karena ketikasayHello
dipanggil dalam lingkup statis, variabel statisa
tidak diinisialisasi.sumber
Ya, semua penginisialisasi statis dijalankan sebelum Anda mengakses kelas untuk pertama kalinya. Jika ada cara lain, saya akan menyebutnya bug.
sumber