Programmēšana

Klases un objekta inicializēšana Java

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 xvē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; }

Objekta inicializācija atspoguļo klases inicializāciju

$config[zx-auto] not found$config[zx-overlay] not found