Urutan Inisialisasi Variabel Statis
1. Aturan sederhana
Pertama, mari kita lihat kode Java yang paling umum:
tes kelas publik {public static test1 t = new test1 (); Int statis publik = 0; int b public static; public static void main (string [] arg) {System.out.println (test.a); System.out.println (test.b); }} class test1 {public test1 () {test.a ++; Test.b ++; }}Berikut adalah tebakan apa hasil output dari konsol?
Oke, mungkin Anda sudah menebak hasilnya di bawah ini, jadi Anda masih akrab dengan Java.
Salin kode sebagai berikut: 0 1
Jika Anda tidak mengerti mengapa hasil di atas adalah output, maka saya akan memberi tahu Anda.
Inisialisasi variabel statis Java mengikuti aturan berikut:
Setelah membaca ini, Anda akan memahami bahwa nilai tes. A telah berubah tiga kali.
Diatur ke 0 saat dinyatakan >> test1 :: test1 diatur ke 1 >> test.a diinisialisasi ke 0
2. Aturan kompleks
Jika Anda memahami ini, silakan lihat kode di bawah ini.
Public Class A {public static int b = ba; public static a plus = baru a ("a"); final final statis publik = (int) (math.random ()*100); public static b p = b baru b ("a"); Public Static Final String FinalStr = "FinalStr"; final integer final statis public = integer baru (10); Int statis publik = 1; Statis publik B C = NULL; public a (string from) {System.out.println ("----------- Mulai A :: A ----------------"); System.out.println ("a :: a, from ="+from); System.out.println ("A :: A, AB ="+AB); System.out.println ("A :: a, a.finalint ="+a.finalint); System.out.println ("A :: A, BA ="+BA); System.out.println ("a :: a, b.plus ="+b.plus); System.out.println ("----------- Akhir A :: A ----------------"); } public static void main (string [] arg) {System.out.println ("main, ab ="+ab); System.out.println ("Main, bt ="+bt); System.out.println ("Main, Ca ="+Ca); }} class b {public static int t = aa; public static a plus = baru a ("b"); Int statis publik = 1; publik b (string from) {System.out.println ("----------- Begin b :: B -----------------------"); System.out.println ("b :: b, dari ="+from); System.out.println ("B :: B, BA ="+BA); System.out.println ("B :: B, AA ="+AA); System.out.println ("B :: B, AP ="+AP); System.out.println ("B :: B, A.Plus ="+A.plus); System.out.println ("B :: B, A.Finalint ="+A.Finalint); System.out.println ("B :: B, A.Finalint ="+A.Finalint); System.out.println ("B :: B, A.Finalint ="+A.Finalint); System.out.println ("B :: B, A.Finalint ="+A.Finalint); System.out.println ("B :: B, A.FinalInteger ="+A.FinalInteger); System.out.println ("B :: B, A.FinalStr ="+A.FinalStr); System.out.println ("----------- Akhir B :: B ----------------"); }} class c {public static final a = new a ("c");}Bisakah Anda menebak hasil output? Saya menulisnya saat menguji, jadi saya tidak menebaknya. Ha ha
Hasil output konsol adalah:
----------- Mulai a :: a ---------------- a :: a, from = ba :: a, ab = 0a :: a, a.finalint = 0a :: a, ba = 0a :: a, b.plus = null ----------- Acara a :: a -------------- A.finalint = 0a :: a, ba = 1a :: a, b.plus=a@a90653---------- end a :: a ------------------------------- B :: B ---------------- B :: B, dari = AB :: B, BA = 1B :: B, AA = 0B :: B, AP = BAULB: B, BA = 1B :: B, AA = 0B :: B, AP = TOULB: BA = 1B :: B, AA = 0B :: B, AP = NULB: BA = 1B :: B, AA = 0B :: B, AP = NULB: BA = 1B :: B, AA = 0B :: B, AP = NULB: BA = 1B :: B, AA = 0B :: B, AP = TOULB: A. finalint = 61b :: b, a.finalinteger = nullb :: b, a.finalStr = finalStr ----------- Akhir B :: B -----------------, AB = 1Main, Bt = 0 ----------- AM :: A ------------ A ,: A, dari = Ca :: A, AB = 1A :: A ------------ A ,: A, dari = Ca :: A, AB = 1A :: A ------------ A ,: A, dari = ca :: A, AB = 1A :: A, A, A, A, AB :: A, AB = 1A :: A, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, B.plus=a@a90653---------- Akhiri A :: A -------------------- Main, CA = A@61DE33
Anda tidak menebak hasil ini, haha.
Dibutuhkan banyak waktu untuk menjelaskan hasil eksekusi program satu per satu. Di sini kita akan secara langsung menuliskan aturan yang diikuti oleh inisialisasi variabel statis Java.
Aturan dalam paragraf pertama masih valid, tetapi tidak sehat.
Inisialisasi data statis
Menambahkan bidang yang memenuhi syarat statis adalah bidang kelas yang disebut, yang berarti bahwa pemilik bidang ini bukan objek tetapi kelas. Tidak peduli berapa banyak objek yang dibuat, hanya ada satu salinan data statis.
Bidang statis selalu diinisialisasi di kelas dan kemudian bidang umum diinisialisasi. Kemudian inisialisasi konstruktor. Namun, jika objek kelas ini tidak dibuat, objek tidak akan diinisialisasi dan hanya akan dieksekusi sekali.
Seperti dalam kode berikut, di kelas staticinitialization, tabel tabel statis = tabel baru (); Pertama, dan kemudian objek tabel tidak akan diinisialisasi, jika tidak itu tidak akan diinisialisasi.
Class Bowl {Bowl (int marker) {print ("mangkuk (" + marker + ")"); } void f1 (int marker) {print ("f1 (" + marker + ")"); }} Tabel kelas {static Bowl Bowl1 = mangkuk baru (1); Table () {print ("TABLE ()"); Bowl2.f1 (1); } void f2 (int marker) {print ("f2 (" + marker + ")"); } static Bowl Bowl2 = mangkuk baru (2);} lemari kelas {mangkuk mangkuk3 = mangkuk baru (3); mangkuk statis mangkuk4 = mangkuk baru (4); Lemari () {print ("lemari ()"); Bowl4.f1 (2); } void f3 (int marker) {print ("f3 (" + marker + ")"); } static Bowl Bowl5 = mangkuk baru (5);} kelas publik staticinitialization {public static void main (string [] args) {print ("membuat lemari baru () di main"); lemari baru (); print ("Membuat Lemari Baru () di Main"); lemari baru (); Table.f2 (1); lemari.f3 (1); } tabel tabel statis = tabel baru (); Lemari lemari statis = lemari baru ();}Keluaran:
Mangkuk (1) mangkuk (2) meja () f1 (1) mangkuk (4) mangkuk (5) mangkuk (3) lemari () F1 (2) Membuat lemari baru () di Mainbowl (3) Lemari () F1 (2) Membuat Lemari Baru () di Mainbowl (3) Lemari () F1 (2) F2 (1) F3 (1) di Mainbowl (3) F1 (2) F2 (1) F3 (1) (1)
Inisialisasi statis yang ditampilkan (yaitu, blok statis)
Menempatkan beberapa pernyataan inisialisasi dalam penjepit statis disebut blok statis. Bahkan, itu ditulis bersama dengan menulis banyak statika, dan esensinya sama. Dijalankan hanya ketika objek dibuat untuk pertama kalinya atau bidang kelas diakses untuk pertama kalinya, dan hanya sekali.
class cup {cup (int marker) {print ("cup (" + marker + ")"); } void f (int marker) {print ("f (" + marker + ")"); }} class cups {cangkir static cup1; cangkir cangkir statis2; static {cup1 = cangkir baru (1); cup2 = cangkir baru (2); } Cups () {print ("cups ()"); }} kelas publik ExplicitStatic {public static void main (string [] args) {print ("di dalam main ()"); Cups.cup1.f (99); // (1)} // cangkir statis gelas1 = cangkir baru (); // (2) // cangkir statis cangkir2 = cangkir baru (); // (2)}Keluaran:
Di dalam Main () cangkir (1) cangkir (2) F (99)
Inisialisasi instance non-statis
Tidak ada yang bisa dikatakan tentang ini, itu hanya inisialisasi biasa, dieksekusi secara berurutan, dan dapat dieksekusi beberapa kali.
class mug {mug (int marker) {print ("mug (" + marker + ")"); } void f (int marker) {print ("f (" + marker + ")"); }} mug kelas publik {mug mug1; Mug mug2; {mug1 = mug baru (1); mug2 = mug baru (2); cetak ("Mug1 & Mug2 diinisialisasi"); } Mug () {print ("mug ()"); } Mug (int i) {print ("mug (int)"); } public static void main (string [] args) {print ("Inside Main ()"); mug baru (); print ("mug baru () selesai"); mug baru (1); cetak ("mug baru (1) selesai"); }}Di dalam Main () Mug (1) Mug (2) MUG1 & MUG2 DiinisialisasiMugs () mug baru () felivelMUG (1) mug (2) mug1 & mug2 inisialisasi mug (int) mug baru (1) selesai