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?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
Keluaran:
initializer statis disebut
initializer contoh disebut
disebut konstruktor
initializer contoh disebut
disebut konstruktor
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 menulis
int b;
b = 0;
Oleh 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:
- Kode inisialisasi harus menangani pengecualian
- Lakukan perhitungan yang tidak dapat diekspresikan dengan initializer variabel instan.
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.
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/…