Pirms to lietošanas Java klasēm un objektiem jābūt inicializētām. Jūs jau iepriekš uzzinājāt, ka klases lauki tiek inicializēti pēc noklusējuma, kad klases tiek ielādētas, un ka objekti tiek inicializēti, izmantojot konstruktorus, taču inicializēšanai ir vēl vairāk. Šis raksts iepazīstina ar visām Java funkcijām klašu un objektu inicializēšanai.
lejupielādēt Iegūt kodu Lejupielādējiet šajā apmācībā avota kodu, piemēram, lietojumprogrammām. Izveidoja Jeff Friesen JavaWorld.Kā inicializēt Java klasi
Pirms izpētīsim Java atbalstu klases inicializēšanai, atkārtosim Java klases inicializācijas soļus. Apsveriet 1. sarakstu.
Saraksts 1. Inicializē klases laukus pēc noklusējuma vērtībām
klase SomeClass {statiskā būla b; statiskais baits; statiskā char c; statiskā dubultā d; statiskais pludiņš f; statiskā int i; statisks garš l; statiskās īsās s; statiskā Stīgu st; }
1. saraksts deklarē klasi SomeClass
. Šī klase deklarē deviņus veidu laukus būla
, baits
, char
, dubultā
, peldēt
, int
, ilgi
, īss
, un Stīga
. Kad SomeClass
ir ielādēts, katra lauka biti tiek iestatīti uz nulli, ko jūs interpretējat šādi:
nepatiesa 0 \ u0000 0.0 0.0 0 0 0 null
Iepriekšējie klases lauki netieši tika inicializēti uz nulli. Tomēr jūs varat arī skaidri inicializēt klases laukus, tieši piešķirot tiem vērtības, kā parādīts 2. sarakstā.
Saraksts 2. Inicializē klases laukus, lai izteiktu vērtības
klase SomeClass {static boolean b = true; statiskais baits pēc = 1; statiskā char c = 'A'; statiskā dubultā d = 2,0; statiskais pludiņš f = 3,0f; statiskā int i = 4; statisks garš l = 5000000000L; statisks īss s = 20000; statiskā virkne st = "abc"; }
Katra uzdevuma vērtībai jābūt saderīgai ar klases lauka tipu. Katrs mainīgais vērtību tieši saglabā, izņemot sv
. Mainīgs sv
saglabā atsauci uz a Stīga
objekts, kas satur abc
.
Atsauce uz klases laukiem
Inicializējot klases lauku, ir likumīgi to inicializēt līdz iepriekš inicializēta klases lauka vērtībai. Piemēram, 3. saraksts tiek inicializēts y
uz x
vērtība. Abi lauki tiek inicializēti 2
.
Saraksts 3. Atsauce uz iepriekš deklarēto lauku
klase SomeClass {static int x = 2; statiskā int y = x; public static void main (String [] args) {System.out.println (x); System.out.println (y); }}
Tomēr otrādi nav likumīgi: jūs nevarat inicializēt klases lauku pēc vēlāk deklarētā klases lauka vērtības. Java kompilatora izejas nelikumīga atsauce uz priekšu
kad tā sastopas ar šo scenāriju. Apsveriet 4. sarakstu.
Saraksts 4. Mēģinājums atsaukties uz vēlāk deklarēto lauku
klase SomeClass {static int x = y; statiskā int y = 2; public static void main (String [] args) {System.out.println (x); System.out.println (y); }}
Sastādītājs ziņos nelikumīga atsauce uz priekšu
kad tā sastopas statiskā int x = y;
. Tas ir tāpēc, ka pirmkods tiek apkopots no augšas uz leju, un kompilators vēl nav redzējis y
. (Tas arī izdotu šo ziņojumu, ja y
nebija tieši inicializēts.)
Klases inicializācijas bloki
Dažos gadījumos jūs varētu vēlēties veikt sarežģītas, uz klases balstītas inicializācijas. Jūs to izdarīsit pēc tam, kad klase ir ielādēta un pirms šajā klasē ir izveidoti objekti (pieņemot, ka klase nav lietderības klase). Šim uzdevumam varat izmantot klases inicializācijas bloku.
A klases inicializācijas bloks ir paziņojumu bloks, pirms kura ir statisks
atslēgvārds, kas tiek ieviests klases ķermenī. Kad klase tiek ielādēta, šie paziņojumi tiek izpildīti. Apsveriet iespēju norādīt 5. sarakstu.
Saraksts 5. Iniciē sinusa un kosinusa vērtību masīvus
klase Grafika {statiski dubulti [] sinusi, kosinusi; statisks {sines = jauns dubultā [360]; kosinusi = jauns dubultā [360]; par (int i = 0; i <sines.length; i ++) {sines [i] = Math.sin (Math.toRadians (i)); kosinusi [i] = Math.cos (Math.toRadians (i)); }}}
5. saraksts deklarē a Grafika
klase, kas deklarē sinusa
un kosinus
masīva mainīgie. Tas arī deklarē klases inicializācijas bloku, kas izveido 360 elementu masīvus, kuriem ir piešķirtas atsauces sinusa
un kosinus
. Tad tā izmanto a priekš
paziņojumu, lai inicializētu šos masīva elementus atbilstošajās sinusa un kosinusa vērtībās, izsaucot Matemātika
klases grēks ()
un cos ()
metodes. (Matemātika
ir daļa no Java standarta klases bibliotēkas. Es apspriedīšu šo klasi un šīs metodes nākamajā rakstā.)
Veiktspējas triks
Tā kā grafikas lietojumprogrammām ir svarīga veiktspēja un ka ātrāk piekļūt masīva elementam nekā izsaukt metodi, izstrādātāji izmanto tādus veiktspējas trikus kā sinusa un kosinusa masīvu izveidošana un inicializēšana.
Kombinējot klases lauka inicializētājus un klases inicializācijas blokus
Lietojumprogrammā var apvienot vairākus klases lauku inicializētājus un klases inicializācijas blokus. 6. saraksts sniedz piemēru.
Saraksts 6. Veic klases inicializēšanu no augšas uz leju
klase MCFICIB {static int x = 10; statiskā dubultā temperatūra = 98,6; statisks {System.out.println ("x =" + x); temp = (temp - 32) * 5,0 / 9,0; // konvertēt uz Celsija sistēmu.out.println ("temp =" + temp); } statiskā int y = x + 5; statisks {System.out.println ("y =" + y); } public static void main (String [] args) {}}
6. saraksts deklarē un inicializē klases lauku pāri (x
un y
), un paziņo pāris statisks
inicializētāji. Apkopojiet šo sarakstu, kā parādīts:
javac MCFICIB.java
Pēc tam palaidiet iegūto lietojumprogrammu:
java MCFICIB
Jums jāievēro šāda izeja:
x = 10 temp = 37,0 y = 15
Šī izeja parāda, ka klases inicializēšana tiek veikta no augšas uz leju.
() metodes
Apkopojot klases inicializatorus un klases inicializācijas blokus, Java kompilators kompilēto baitkodu (augšā-lejup secībā) saglabā īpašā metodē ar nosaukumu ()
. Leņķa kronšteini novērš a vārdu konflikts: jūs nevarat deklarēt a ()
metode avota kodā, jo <
un >
rakstzīmes ir nelikumīgas identifikatora kontekstā.
Pēc klases ielādes JVM izsauc šo metodi pirms zvana galvenais ()
(kad galvenais ()
ir klāt).
Ieskatīsimies iekšā MCFICIB.klase
. Turpmākajā daļējā demontāžā tiek parādīta saglabātā informācija par x
, temp
, un y
lauki:
Lauks Nr. 1 00000290 Piekļuves karodziņi ACC_STATIC 00000292 Nosaukums x 00000294 I deskriptors 00000296 Atribūtu skaits 0 lauks # 2 00000298 Piekļuves karodziņi ACC_STATIC 0000029a Nosaukuma temp 0000029c deskriptors D 0000029e Atribūtu skaits 0 lauks # 3 000002a0 Piekļuves karodziņi ACC_STATIC 006 0
The Apraksts
līnija identificē JVM tipa deskriptors laukam. Veidu apzīmē ar vienu burtu: Es
priekš int
un D
priekš dubultā
.
Šī daļējā demontāža atklāj ()
metodi. Katra rinda sākas ar decimāldaļu, kas identificē nākamās instrukcijas nulles bāzes nobīdes adresi:
0 bipush 10 2 putstatic MCFICIB / x I 5 ldc2_w # 98.6 8 putstatic MCFICIB / temp D 11 getstatic java / lang / System / out Ljava / io / PrintStream; 14 new java / lang / StringBuilder 17 dup 18 invokespecial java / lang / StringBuilder / () V 21 ldc "x =" 23 invokevirtual java / lang / StringBuilder / append (Ljava / lang / String;) Ljava / lang / StringBuilder; 26 getstatic MCFICIB / x I 29 invokevirtual java / lang / StringBuilder / append (I) Ljava / lang / StringBuilder; 32 invokevirtual java / lang / StringBuilder / toString () Ljava / lang / String; 35 invokevirtual java / io / PrintStream / println (Ljava / lang / String;) V 38 getstatic MCFICIB / temp D 41 ldc2_w # 32 44 dsub 45 ldc2_w # 5 48 dmul 49 ldc2_w # 9 52 ddiv 53 putstatic MCFICIB / temp D 56 getstatic java / lang / System / out Ljava / io / PrintStream; 59 jauns java / lang / StringBuilder 62 dup 63 invokespecial java / lang / StringBuilder / () V 66 ldc "temp =" 68 invokevirtual java / lang / StringBuilder / append (Ljava / lang / String;) Ljava / lang / StringBuilder; 71 getstatic MCFICIB / temp D 74 invokevirtual java / lang / StringBuilder / append (D) Ljava / lang / StringBuilder; 77 invokevirtual java / lang / StringBuilder / toString () Ljava / lang / String; 80 invokevirtual java / io / PrintStream / println (Ljava / lang / String;) V 83 getstatic MCFICIB / x I 86 iconst_5 87 iadd 88 putstatic MCFICIB / y I 91 getstatic java / lang / System / out Ljava / io / PrintStream; 94 new java / lang / StringBuilder 97 dup 98 invokespecial java / lang / StringBuilder / () V 101 ldc "y =" 103 invokevirtual java / lang / StringBuilder / append (Ljava / lang / String;) Ljava / lang / StringBuilder; 106 getstatic MCFICIB / y I 109 invokevirtual java / lang / StringBuilder / append (I) Ljava / lang / StringBuilder; 112 invokevirtual java / lang / StringBuilder / toString () Ljava / lang / String; 115 invokevirtual java / io / PrintStream / println (Ljava / lang / String;) V 118 atgriešanās
Komandu secība no nobīdes 0 līdz 2. nobīdei ir ekvivalenta šādam klases lauka inicializatoram:
statiskā int x = 10;
Komandu secība no 5. nobīdes līdz 8. nobīdei ir ekvivalenta šādam klases lauka inicializatoram:
statiskā dubultā temperatūra = 98,6;
Instrukciju secība no 11. nobīdes līdz 80. nobīdei ir ekvivalenta šādam klases inicializācijas blokam:
statisks {System.out.println ("x =" + x); temp = (temp - 32) * 5,0 / 9,0; // konvertēt uz Celsija sistēmu.out.println ("temp =" + temp); }
Komandu secība no nobīdes 83 līdz 88 nobīdei ir ekvivalenta šādam klases lauka inicializatoram:
statiskā int y = x + 5;
Instrukciju secība no nobīdes 91 līdz nobīdei 115 ir ekvivalenta šādam klases inicializācijas blokam:
statisks {System.out.println ("y =" + y); }
Visbeidzot atgriešanās
instrukcija nobīdē 118 atgriež izpildi no ()
uz to JVM daļu, kas sauca šo metodi.
Neuztraucieties par to, ko nozīmē baitkods
Šī uzdevuma veikšana ir redzēt, ka viss saraksts 6. klases lauka inicializatoros un klases inicializācijas blokos atrodas ()
metodi, un tas tiek izpildīts no augšas uz leju.
Kā inicializēt objektus
Kad klase ir ielādēta un inicializēta, jūs bieži vēlaties izveidot objektus no klases. Kā jūs uzzinājāt manā nesenajā ievadā par programmēšanu ar klasēm un objektiem, jūs inicializējat objektu, izmantojot kodu, kuru ievietojat klases konstruktorā. Apsveriet iespēju norādīt 7. sarakstu.
Saraksts 7. Konstruktora izmantošana objekta inicializēšanai
klase Pilsēta {privātās virknes nosaukums; int populācija; Pilsēta (virknes nosaukums, int populācija) {this.name = name; šī.populācija = populācija; } @Orride public String toString () {return name + ":" + populācija; } public static void main (String [] args) {City newYork = new City ("Ņujorka", 8491079); System.out.println (newYork); // Izeja: Ņujorka: 8491079}}
7. saraksts deklarē a Pilsēta
klase ar nosaukums
un populācija
lauki. Kad Pilsēta
objekts ir izveidots, Pilsēta (virknes nosaukums, vidējie iedzīvotāji)
konstruktors tiek aicināts inicializēt šos laukus uz izsauktā konstruktora argumentiem. (Es arī esmu ignorējis Objekts
's publiskā virkne līdz virknei ()
metode, lai ērti atgrieztu pilsētas nosaukumu un iedzīvotāju vērtību kā virkni. System.out.println ()
galu galā izsauc šo metodi, lai atgrieztu objekta virknes attēlojumu, ko tas izdod.)
Pirms konstruktora izsaukšanas, kādas vērtības dara nosaukums
un populācija
satur? To var uzzināt, ievietojot System.out.println (tas.nosaukums); System.out.println (šī populācija);
konstruktora sākumā. Pēc avota koda apkopošanas (javac City.java
) un palaist lietojumprogrammu (java pilsēta
), jūs ievērotu nulle
priekš nosaukums
un 0
priekš populācija
. The jauns
pirms noformētāja izpildītāja operators nulles objekta objekta (instances) laukus.
Tāpat kā klases laukos, jūs varat skaidri inicializēt objektu laukus. Piemēram, jūs varētu norādīt Virknes nosaukums = "Ņujorka";
vai int populācija = 8491079;
. Tomēr, to darot, parasti nav ko iegūt, jo šie lauki tiks inicializēti konstruktorā. Vienīgais ieguvums, ko es varu iedomāties, ir noklusējuma vērtības piešķiršana objekta laukam; šī vērtība tiek izmantota, izsaucot konstruktoru, kas lauku neinicializē:
int numDoors = 4; // numDoors Car piešķirtā noklusējuma vērtība (String make, String model, int gads) {this (marka, modelis, gads, numDoors); } Auto (Stīgu marka, Stīgu modelis, int gads, int numDoors) {this.make = marka; this.model = modelis; tas.gads = gads; this.numDoors = numDoors; }