Kata pengantar
Di Java, suatu objek harus diinisialisasi dengan benar sebelum dapat digunakan, yang ditentukan oleh spesifikasi Java.
Inisialisasi otomatis (default)
Semua anggota data dasar dari suatu kelas akan diinisialisasi. Jalankan contoh berikut untuk melihat nilai -nilai default ini:
kelas default {boolean t; Char C; byte b; s pendek; int i; Long L; float f; Double D; public void show () {System.out.println ("Nilai Inisialisasi Jenis Dasar/N" + "Boolean <----->" + T + "/n" + "Char <------" + C + "/n" + "Byte <------" " + B +"/N " +" Pendek <------ " +" + " +" + " +"/n " +" l + "/n" + "float <------>" + f + "/n" + "ganda <-----" + d + "/n"); }} kelas publik initvalue {public static void main (string [] args) {default d = new default (); d.show (); }}【Hasil operasi】:
Nilai inisialisasi tipe dasar
Boolean <----- False
char <----->
byte <-----> 0
Pendek <-----> 0
int <-----> 0
Long <-----> 0
Mengapung <-----> 0.0
ganda <-----> 0.0
Di mana, nilai default dari jenis char adalah nol.
Untuk tipe data non-primitif, pegangan objek juga diinisialisasi:
class person {private string name; // setter} kelas default {person p; public void show () {System.out.println ("Person <----->" + p); }} kelas publik initvalue {public static void main (string [] args) {default d = new default (); d.show (); }}【Hasil operasi】:
Orang <-----> NULL
Dapat dilihat bahwa nilai inisialisasi pegangan adalah nol. Ini berarti bahwa jika metode yang mirip dengan p.setName dipanggil tanpa menentukan nilai inisialisasi untuk P, pengecualian akan terjadi.
Inisialisasi Peraturan
Jika Anda perlu menetapkan nilai awal untuk variabel sendiri, Anda dapat menetapkan nilai saat mendefinisikan variabel.
kelas default {boolean t = true; char c = 'a'; byte b = 47; S short s = 0xff; int i = 24; long l = 999; float f = 1.2f; Double D = 1.732; public void show () {System.out.println ("boolean <-----" + t + "/n" + "char <------" + c + "/n" + "byte <------->" + b + "/n" + " + i +" + " +" + "/n" + "int <-----" + " +" + " +" + "/n" "float <--------" " + f +"/n " +" ganda <------ " + d +"/n "); }} kelas publik initvalue {public static void main (string [] args) {default d = new default (); d.show (); }}Bahkan dapat diinisialisasi dalam satu cara;
class person {int i = set (); // ...}Metode ini juga dapat menggunakan variabel independen:
class person {int i; int j = set (i); // ...} Inisialisasi pembangun
Keuntungan menginisialisasi pembangun adalah bahwa nilai inisialisasi dapat ditentukan selama runtime. Misalnya:
class orang {int usia; Orang () {usia = 89; }}Usia pertama -tama akan diinisialisasi ke 0 dan kemudian menjadi 89. Ini berlaku untuk semua tipe dasar serta menangani objek.
Urutan Inisialisasi
Di kelas, urutan inisialisasi ditentukan oleh urutan di mana variabel didefinisikan dalam kelas. Bahkan jika definisi variabel sebagian besar tersebar di tengah definisi metode, variabel masih akan diinisialisasi sebelum memanggil metode apa pun (termasuk konstruktor). Misalnya:
kelas PET {PET (int usia) {System.out.println ("PET (" + usia + ")"); }} class Person {Pet t1 = Pet baru (1); Person () {System.out.println ("--- orang () ---"); T3 = Pet baru (33); } PET T2 = PET baru (2); void show () {System.out.println ("Show ----- Running"); } PET t3 = PET baru (3);} kelas publik orderofinitialization {public static void main (string [] args) {person p = new orang (); p.show (); }}【Hasil operasi】:
Hewan peliharaan (1)
Hewan peliharaan (2)
Pet (3)
--Orang()---
Pet (33) <br/>
Tunjukkan ----- Berlari
Dalam contoh di atas, meskipun definisi T1, T2, dan T3 ada di seluruh kelas, urutan inisialisasi ditentukan oleh urutan definisi T1, T2, dan T3 (Ubah T1, T2, dan T3 sendirian untuk melihat hasilnya), dan inisialisasi lebih diutamakan daripada eksekusi pembangun. Ketika pembangun orang dipanggil, T3 diinisialisasi ulang.
Inisialisasi data statis
Jika data statis, proses yang sama akan dilakukan. Jika itu adalah tipe primitif dan tidak diinisialisasi, ia akan secara otomatis mendapatkan nilai awal tipe primitif standar sendiri; Jika itu adalah pegangan ke suatu objek, ia akan mendapatkan nilai nol kecuali jika suatu objek dibuat dan terhubung ke sana. Jika diinisialisasi pada waktu definisi, metode yang diambil berbeda dari nilai non-statis, karena statis hanya memiliki satu area penyimpanan. Misalnya:
Class Bowl {Bowl (Int Marker) {System.out.println ("Bowl (" + Marker + ")"); } void f (int marker) {System.out.println ("f (" + marker + ")"); }} tabel kelas {static mangkuk b1 = mangkuk baru (1); Table () {System.out.println ("Table ()"); b2.f (1); } void f2 (int marker) {system.out.println ("f2 (" + marker + ")"); } mangkuk statis b2 = mangkuk baru (2);} lemari kelas {mangkuk b3 = mangkuk baru (3); mangkuk statis b4 = mangkuk baru (4); Lemari () {System.out.println ("Lemari ()"); b4.f (2); } void f3 (int marker) {system.out.println ("f3 (" + marker + ")"); } mangkuk statis b5 = mangkuk baru (5);} kelas publik staticinitialization {public static void main (string [] args) {System.out.println ("Membuat lemari baru () di main"); lemari baru (); System.out.println ("Membuat Lemari Baru () di Main"); lemari baru (); t2.f2 (1); t3.f3 (1); } tabel statis t2 = tabel baru (); Lemari statis T3 = Lemari baru ();}【Hasil operasi】:
Mangkuk (1)
Mangkuk (2)
Meja()
f (1)
Mangkuk (4)
Mangkuk (5)
Mangkuk (3)
Lemari()
f (2)
Membuat Lemari Baru () di Main
Mangkuk (3)
Lemari()
f (2)
Membuat Lemari Baru () di Main
Mangkuk (3)
Lemari()
f (2)
F2 (1)
F3 (1)
Blok kode statis
Java memungkinkan pekerjaan inisialisasi statis lainnya dibagi menjadi blok kode khusus di kelas. Blok kode ini dalam bentuk kata kunci statis diikuti oleh badan metode, yang disebut blok kode statis. Blok kode statis dieksekusi hanya ketika objek kelas itu dihasilkan untuk pertama kalinya atau anggota statis milik kelas itu diakses untuk pertama kalinya. Misalnya:
class person {person (int usia) {System.out.println ("orang (" + usia + ")"); } void f (int usia) {System.out.println ("f (" + usia + ")"); }} class orang {statis orang p1; orang statis P2; static {p1 = orang baru (1); p2 = orang baru (2); } Orang () {System.out.println ("orang ()"); }} kelas publik ExplicitStatic {public static void main (string [] args) {System.out.println ("Inside Main ()"); Orang.Saat mengakses objek statis P1 dalam baris yang ditandai 1, atau jika baris 1 dikomentari dan baris 2 tidak dikomentari, modul inisialisasi statis untuk orang akan berjalan. Jika 1 dan 2 dikomentari, blok kode statis yang digunakan untuk orang tidak akan dieksekusi.
Urutan properti statis dan eksekusi blok kode statis
class person {person (int usia) {System.out.println ("orang ("+usia+")"); }} class orang {statis orang p = orang baru (2); // 1 static {p = orang baru (3); } orang statis p = orang baru (2); // 2} kelas publik compstaticinit {public static void main (string [] args) {} static orang x = orang baru ();}Menurut analisis hasil anotasi 1 mempertahankan 2 dan anotasi 2 mempertahankan 1, dapat dilihat bahwa urutan eksekusi sifat statis dan blok kode statis tergantung pada urutan pengkodean. Siapa pun yang ada di depan akan dieksekusi terlebih dahulu.
Inisialisasi sifat non-statis
kelas hewan {hewan (int usia) {System.out.println ("hewan (" + usia + ")"); } void f (int usia) {System.out.println ("f (" + usia + ")"); }} kelas publik notstaticinit {hewan a1; Hewan A2; {a1 = hewan baru (1); A2 = hewan baru (2); System.out.println ("A1 & A2 diinisialisasi"); } NotstaticInit () {System.out.println ("notstaticInit"); } public static void main (string [] args) {System.out.println ("Inside Main ()"); Notstaticinit x = new notstaticinit (); }}Mirip dengan blok kode statis, urutan inisialisasi blok kode anonim dengan properti non-statis tergantung pada urutan pengkodean .
Proses inisialisasi objek yang diwariskan
serangga kelas {int i = 1; int j; Serangga () {prt ("i =" + i + ", j =" + j); j = 2; } static int x1 = prt ("static serangga.x1 diinisialisasi"); static int prt (string s) {system.out.println (s); kembali 3; }} Kelas publik Beetle memperluas serangga {int k = prt ("Beeklt.k diinisialisasi"); Beetle () {prt ("k =" + k); prt ("j =" + j); } static int x2 = prt ("static bootle.x2 diinisialisasi"); static int prt (string s) {system.out.println (s); kembali 4; } public static void main (string [] args) {prt ("Beetle constructor"); Beetle B = Beetle baru (); }}【Hasil operasi】:
Inisialisasi serangga statis.x1 diinisialisasi
Static Bootle.x2 diinisialisasi
Konstruktor kumbang
i = 1, j = 0
Beeklt.k diinisialisasi
k = 4
j = 2
Hal pertama yang terjadi saat menjalankan Java di Beetle adalah loader untuk menemukan kelas di luar. Selama proses pemuatan, loader menemukan kelas dasar, sehingga dimuat sesuai. Proses ini akan dilakukan terlepas dari apakah objek kelas yang mendasarinya dihasilkan atau tidak. Jika kelas dasar berisi kelas dasar lain, kelas dasar lainnya akan dimuat, dan seterusnya. Selanjutnya, lakukan inisialisasi statis di kelas basis root, lalu jalankan di kelas turunan berikutnya, dan sebagainya. Ini karena inisialisasi kelas turunan dapat tergantung pada inisialisasi anggota kelas yang mendasarinya.
Saat semua kelas dimuat, objek dapat dibuat. Pertama, semua tipe data dasar dalam objek ini diatur ke nilai defaultnya dan pegangan objek diatur ke null. Kemudian jalankan pembangun kelas dasar. Situasi ini dilakukan secara otomatis ( super(), dan pembangun kelas dasar juga dapat ditentukan melalui super). Setelah pembangun kelas dasar selesai, variabel instance kelas turunan akan diinisialisasi dalam urutan aslinya, dan bagian tubuh yang tersisa dari pembangun akan dieksekusi.
Merangkum proses pembuatan objek:
Eksekusi statis hanya dilakukan ketika kelas dimuat dan hanya sekali;
Non-statis hanya dieksekusi saat dipakai, dan mengeksekusi setiap kali objek dibuat;
Eksekusi statis dilakukan sebelum non-statis, dan kelas dasar statis mendahului eksekusi statis di atas kelas turunan;
Properti eksekusi dari sifat statis dan blok kode statis tergantung pada posisi mereka di kelas, dan yang mengeksekusi mereka terlebih dahulu;
Urutan eksekusi properti non-statis dan blok konstruktor tergantung pada posisinya di kelas dan yang mengeksekusi sebelum mereka.
Meringkaskan
Melalui pengantar di atas, kami memiliki pemahaman tentang beberapa cara untuk menginisialisasi objek di Java dan bagaimana menjalankan kode inisialisasi, dan juga memperkenalkan situasi yang dapat kami gunakan variabel yang tidak diinisialisasi. Setelah mendapatkan pemahaman terperinci tentang masalah ini, Anda dapat menghindari beberapa risiko dalam pengkodean untuk memastikan bahwa suatu objek sepenuhnya diinisialisasi sebelum menjadi terlihat.