Pertanyaan saya adalah tentang penggunaan kata kunci statis tertentu. Dimungkinkan untuk menggunakan static
kata kunci untuk menutupi blok kode dalam kelas yang bukan milik fungsi apa pun. Misalnya kompilasi kode berikut:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Jika Anda menghapus static
kata kunci itu mengeluh karena variabel a
adalah final
. Namun dimungkinkan untuk menghapus keduanya final
dan static
kata kunci dan membuatnya kompilasi.
Ini membingungkan bagi saya dalam dua hal. Bagaimana saya bisa memiliki bagian kode yang bukan milik metode apa pun? Bagaimana mungkin memohonnya? Secara umum, apa tujuan dari penggunaan ini? Atau lebih baik, di mana saya dapat menemukan dokumentasi tentang ini?
sumber
public static void staticMethod(){}
, jika Anda mengeksekusiTestStatic.class.getMethod("staticMethod");
. Penginisialisasi statis tidak akan dipanggil. Info lebih lanjut di sini docs.oracle.com/javase/specs/jvms/se10/html/…Uff! apa itu penginisialisasi statis?
Penginisialisasi statis adalah
static {}
blok kode di dalam kelas java, dan dijalankan hanya satu kali sebelum konstruktor atau metode utama dipanggil.BAIK! Ceritakan lebih banyak lagi ...
static { ... }
di dalam setiap kelas java. dan dieksekusi oleh mesin virtual ketika kelas dipanggil.return
pernyataan yang didukung.this
atausuper
didukung.Hmm dimana saya bisa menggunakannya?
Dapat digunakan dimanapun Anda merasa oke :) sesederhana itu. Tapi saya melihat sebagian besar waktu digunakan ketika melakukan koneksi database, API init, Logging dan lain-lain.
Jangan hanya menggonggong! dimana contohnya
Keluaran???
Semoga ini membantu!
sumber
afterPropertiesSet()
dariInitializingBean
?The
static
blok adalah "initializer statis".Itu secara otomatis dipanggil ketika kelas dimuat, dan tidak ada cara lain untuk memanggilnya (bahkan melalui Refleksi).
Saya pribadi hanya pernah menggunakannya ketika menulis kode JNI:
sumber
Method
instance tetapi hanya dipanggil oleh mesin virtual Java.Ini langsung dari http://www.programcreek.com/2011/10/10/java-class-instance-initializers/
1. Perintah Eksekusi
Lihatlah kelas berikut, apakah Anda tahu yang mana yang dieksekusi lebih dulu?
Keluaran:
2. Bagaimana cara kerja initializer instance Java?
Inisialisasi instance di atas berisi pernyataan println. Untuk memahami cara kerjanya, kita bisa memperlakukannya sebagai pernyataan penugasan variabel, misalnya
b = 0
,. Ini bisa membuatnya lebih jelas untuk dipahami.Dari pada
int b = 0
, kamu bisa menulisOleh karena itu, inisialisasi instance dan inisialisasi variabel instan hampir sama.
3. Kapan inisialisasi instance berguna?
Penggunaan inisialisasi instance jarang terjadi, tetapi masih bisa menjadi alternatif yang berguna untuk inisialisasi variabel instan jika:
Tentu saja, kode tersebut dapat ditulis dalam konstruktor. Tetapi jika suatu kelas memiliki banyak konstruktor, Anda harus mengulang kode di setiap konstruktor.
Dengan penginisialisasi instan, Anda bisa menulis kode sekali saja, dan itu akan dieksekusi tidak peduli konstruktor apa yang digunakan untuk membuat objek. (Saya kira ini hanya sebuah konsep, dan tidak sering digunakan.)
Kasus lain di mana inisialisasi instance berguna adalah kelas dalam anonim, yang tidak dapat mendeklarasikan konstruktor sama sekali. (Apakah ini akan menjadi tempat yang baik untuk menempatkan fungsi logging?)
Terima kasih untuk Derhein.
Perhatikan juga bahwa kelas Anonim yang mengimplementasikan antarmuka [1] tidak memiliki konstruktor. Karena itu inisialisasi instance diperlukan untuk mengeksekusi segala jenis ekspresi pada waktu konstruksi.
sumber
"final" menjamin bahwa suatu variabel harus diinisialisasi sebelum akhir kode penginisialisasi objek. Demikian juga "final statis" menjamin bahwa suatu variabel akan diinisialisasi pada akhir kode inisialisasi kelas. Menghilangkan "statis" dari kode inisialisasi Anda mengubahnya menjadi kode inisialisasi objek; dengan demikian variabel Anda tidak lagi memenuhi jaminannya.
sumber
Anda tidak akan menulis kode ke blok statis yang perlu dipanggil di mana saja di program Anda. Jika tujuan dari kode yang akan dipanggil maka Anda harus menempatkannya dalam suatu metode.
Anda dapat menulis blok penginisialisasi statis untuk menginisialisasi variabel statis ketika kelas dimuat tetapi kode ini bisa lebih kompleks ..
Blok penginisialisasi statis terlihat seperti metode tanpa nama, tanpa argumen, dan tanpa tipe pengembalian. Karena Anda tidak pernah menyebutnya, tidak perlu nama. Satu-satunya waktu disebut adalah ketika mesin virtual memuat kelas.
sumber
ketika pengembang menggunakan blok penginisialisasi, Java Compiler menyalin penginisialisasi ke setiap konstruktor dari kelas saat ini.
Contoh:
kode berikut:
setara dengan:
Saya harap contoh saya dipahami oleh pengembang.
sumber
Blok kode statis dapat digunakan untuk instantiate atau menginisialisasi variabel kelas (sebagai lawan variabel objek). Jadi menyatakan "a" statis berarti bahwa hanya satu yang dibagikan oleh semua objek Uji, dan blok kode statis menginisialisasi "a" hanya sekali, ketika kelas Uji pertama kali dimuat, tidak peduli berapa banyak objek Uji yang dibuat.
sumber