Saya melihat kode di bawah ini dan menemukan sesuatu yang agak aneh:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
Saya akan mengharapkan ini untuk memberikan kesalahan kompilasi karena System.out
dengan "y" bukan milik deklarasi metode hanya a { }
. Mengapa ini valid? Saya tidak melihat bagaimana kode ini akan atau harus dipanggil.
Saat menjalankan ini, ia x y c g
juga menghasilkan , mengapa static { }
get dipanggil sebelum konstruktor urutan?
sumber
the code is copied into the beginning of each constructor of the class
- ini tidak benar. Katakanlah konstruktor dimulai dengansuper("x ");
, konstruktor super akan mengeksekusi sebelum blok inisialisasi apa pun.Ini bukan metode tapi blok inisialisasi .
Ini akan dijalankan sebelum panggilan konstruktor. Sementara
adalah blok inisialisasi statis yang dijalankan ketika kelas dimuat oleh pemuat kelas.
Jadi ketika Anda menjalankan kode Anda
1. Kelas dimuat oleh loader kelas sehingga blok inisialisasi statis dijalankan
Output: x dicetak
2. Objek dibuat sehingga blok inisialisasi dijalankan dan kemudian konstuktor disebut
Output: y dicetak diikuti oleh c
3. Metode utama dipanggil yang pada gilirannya memanggil metode go
Output: g dicetak
Hasil akhir: xycg
Ini mungkin membantu http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/
sumber
Itu adalah blok inisialisasi instance yang diikuti dengan blok inisialisasi statis .
dipanggil saat Anda membuat instance kelas.
dipanggil saat kelas dimuat oleh pemuat kelas. Jadi, saat Anda melakukannya
kelas tersebut dimuat, jadi ia mengeksekusi
static {}
, lalu mengeksekusi blok inisialisasi instance{}
, kemudian badan konstruktor dipanggil, dan kemudian metode pada instance yang baru dibuat. Ergo hasilnyax y c g
.sumber
Merupakan blok statis dan dipanggil selama Class Loading
Merupakan blok inisialisasi
Anda dapat memiliki beberapa blok inisialisasi dalam sebuah kelas yang akan dieksekusi sesuai urutan kemunculannya di kelas tersebut.
Perhatikan bahwa setiap blok inisialisasi yang ada di kelas dijalankan sebelum konstruktor.
sumber
adalah blok inisialisasi yang dibagikan oleh kelas (seperti yang ditunjukkan oleh
static
), yang dieksekusi terlebih dahulu.adalah blok inisialisasi yang dibagikan oleh semua objek (konstruktor) kelas, yang muncul berikutnya.
adalah konstruktor khusus untuk kelas, yang dijalankan ketiga. Blok inisialisasi instance dipanggil pertama kali setiap kali konstruktor dijalankan. Itulah mengapa "y" muncul sebelum "c".
hanyalah metode instance yang terkait dengan objek yang dibangun menggunakan konstruktor di atas, yang datang terakhir.
sumber
Jenis blok ini disebut
initializer block
. Ini dijalankan setiap kali Anda membuat instance dari aclass
. Pada waktu kompilasi, kode ini dipindahkan ke setiap konstruktor kelas Anda.Sedangkan dalam kasus
static initializer
blok: -itu dijalankan sekali ketika kelas dimuat. Kami biasanya menggunakan
static
blok penginisialisasi ketika inisialisasistatic
bidang, memerlukan beberapa langkah.sumber
Ini digunakan sebagai blok inisialisasi dan berjalan setelah deklarasi statis apa pun . Ini bisa digunakan untuk memastikan bahwa tidak ada orang lain yang dapat membuat instance kelas (Dengan cara yang sama Anda akan menggunakan konstruktor pribadi) seperti dengan pola desain Singleton .
sumber
Static blocks
hanya dijalankan sekali ketika kelas dimuat dan diinisialisasi oleh JRE.Dan
non-static
blok akan dipanggil setiap kali Anda membuat instance baru dan itu akan dipanggil tepat sebelum Pembuat.Seperti di sini Anda telah membuat hanya 1 contoh dari
Sequence
jadi dibangun telah dipanggil setelahnon-static
blok dan kemudian metode yang sebenarnya tujuan Anda.sumber