Programmēšana

Statiskās klases un iekšējās klases Java valodā

Ligzdotas klases ir klases, kuras ir deklarētas kā citu klašu vai jomas locekļi. Nodarbību ligzdošana ir viens no veidiem, kā labāk organizēt kodu. Piemēram, pieņemsim, ka jums ir klase bez ligzdām (pazīstama arī kā augstākā līmeņa klase), kas objektus glabā maināmā masīvā, kam seko iteratoru klase, kas atgriež katru objektu. Tā vietā, lai piesārņotu augstākā līmeņa klases nosaukumvietu, jūs varētu pasludināt atkārtotāju klasi par maināmu masīvu kolekcijas klases dalībnieku. Tas darbojas, jo abi ir cieši saistīti.

Java ligzdotās klases tiek klasificētas kā vai nu statiskās dalībnieku klases vai iekšējās klases. Iekšējās klases ir statiskas dalībnieku klases, vietējās klases vai anonīmas klases. Šajā apmācībā jūs uzzināsiet, kā strādāt ar statiskām dalībnieku klasēm un trim iekšējo klašu tipiem jūsu Java kodā.

Izvairieties no atmiņas noplūdēm ligzdotajās klasēs

Skatiet arī Java padomu, kas saistīts ar šo apmācību, kur uzzināsiet, kāpēc ligzdotās klases ir neaizsargātas pret atmiņas noplūdēm.

Statiskās nodarbības Java valodā

Manā Java 101 apmācība Klases un objekti Java, jūs uzzinājāt, kā deklarēt statiskos laukus un statiskās metodes kā klases dalībniekus. Programmā Java un objektu inicializēšana jūs uzzinājāt, kā statiskos inicializētājus pasludināt par klases locekļiem. Tagad jūs uzzināsiet, kā deklarēt statiskās klases. Oficiāli pazīstams kā statiskās dalībnieku klases, tās ir ligzdotas klases, kuras jūs deklarējat tādā pašā līmenī kā šīs citas statiskās vienības, izmantojot statisks atslēgvārds. Šeit ir statiskas dalībnieku klases deklarācijas piemērs:

 C klase {static int f; static void m () {} statisks {f = 2; } statiskā D klase {// dalībnieki}} 

Šis piemērs iepazīstina ar augstākā līmeņa klasi C ar statisko lauku f, statiskā metode m (), statiskais inicializētājs un statiskā dalībnieku klase D. Ievērojiet to D ir grupas loceklis C. Statiskais lauks f, statiskā metode m (), un statiskais inicializators ir arī grupas C. Tā kā visi šie elementi pieder klasei C, tas ir pazīstams kā norobežojošā klase. Klase D ir pazīstams kā slēgtā klase.

Pielikuma un piekļuves noteikumi

Lai gan statiskā dalībnieku klase ir slēgta, tā nevar piekļūt norobežojošās klases instances laukiem un atsaukties uz tās eksemplāru metodēm. Tomēr tas var piekļūt norobežojošās klases statiskajiem laukiem un izmantot tās statiskās metodes pat tiem dalībniekiem, kuri ir deklarēti Privāts. Lai parādītu, 1. saraksts deklarē EnclosingClass ar ligzdotu SMClass.

Saraksts 1. Statiskās dalībnieku klases deklarēšana (EnclosingClass.java, 1. versija)

 klase EnclosingClass {privāta statiska virkne s; private static void m1 () {System.out.println (s); } static void m2 () {SMClass.accessEnclosingClass (); } static class SMClass {static void accessEnclosingClass () {s = "Izsaukts no metodes SMClass's accessEnclosingClass ()"; m1 (); } void accessEnclosingClass2 () {m2 (); }}} 

1. sarakstā tiek pasludināta augstākā līmeņa klase ar nosaukumu EnclosingClass ar klases laukumu s, klases metodes m1 () un m2 ()un statisko dalībnieku klase SMClass. SMClass deklarē klases metodi accessEnclosingClass () un instances metodi accessEnclosingClass2 (). Ievērojiet sekojošo:

  • m2 ()atsaukšanās uz SMClass's accessEnclosingClass () metode prasa SMClass. prefikss, jo accessEnclosingClass () tiek deklarēts statisks.
  • accessEnclosingClass () var piekļūt EnclosingClass's s lauku un izsauciet to m1 () metodi, lai gan abi ir deklarēti Privāts.

2. sarakstā tiek parādīts avota kods SMCDemo lietojumprogrammas klase, kas parāda, kā izsaukt SMClass's accessEnclosingClass () metodi. Tas arī parāda, kā instancēt SMClass un piesaukt to accessEnclosingClass2 () instances metode.

2. saraksts. Statiskās dalībnieku klases metožu izsaukšana (SMCDemo.java)

 public class SMCDemo {public static void main (String [] args) {EnclosingClass.SMClass.accessEnclosingClass (); EnclosingClass.SMClass smc = jauns EnclosingClass.SMClass (); smc.accessEnclosingClass2 (); }} 

Kā parādīts 2. sarakstā, ja vēlaties izmantot augstākā līmeņa klases metodi no slēgtas klases, jums jāpievieno pievienotās klases nosaukums pirms tā norobežojošās klases nosaukuma. Tāpat, lai izveidotu slēgtu klasi, jums jāpievieno šīs klases nosaukums pirms tā norobežojošās klases nosaukuma. Pēc tam jūs varat atsaukties uz instances metodi parastajā veidā.

Apkopojiet 1. un 2. ierakstu šādi:

 javac * .java 

Apkopojot pievienojošo klasi, kurā ir statiska dalībnieku klase, sastādītājs izveido klases failu statiskajai dalībnieku klasei, kuras nosaukums sastāv no pievienojošās klases nosaukuma, dolāra zīmes rakstura un statiskās dalībnieku klases nosaukuma. Šajā gadījumā apkopojot rezultātus EnclosingClass $ SMCClass.class un EnclosingClass.class.

Palaidiet lietojumprogrammu šādi:

 java SMCDemo 

Jums jāievēro šāda izeja:

 Zvanīts no metodes SMClass accessEnclosingClass () Izsaukts no metodes SMClass accessEnclosingClass () 

Piemērs: Statiskās klases un Java 2D

Java standarta klases bibliotēka ir klases failu izpildlaika bibliotēka, kurā glabājas apkopotas klases un citi atsauces veidi. Bibliotēkā ir iekļauti daudzi statisko dalībnieku klašu piemēri, daži no tiem atrodami Java 2D ģeometrisko formu klasēs, kas atrodas java.awt.geom iepakojums. (Par pakām uzzināsiet nākamajā Java 101 apmācība.)

The Ellipse2D klase atrasta java.awt.geom apraksta elipsi, kuru definē ierāmēšanas taisnstūris (x, y) augšējā kreisajā stūrī, kā arī platuma un augstuma pakāpe. Šis koda fragments parāda, ka šīs klases arhitektūra ir balstīta Peldēt un Dubultā statiskās dalībnieku klases, kuras abas apakšklases Ellipse2D:

 publiskā abstraktā klase Ellipse2D paplašina RectangularShape {publiskā statiskā klase Float izplešas Ellipse2D īsteno Serializējamais {publiskais pludiņš x, y, platums, augstums; public Float () {} public Float (float x, float y, float w, float h) {setFrame (x, y, w, h); } public double getX () {return (double) x; } // papildu gadījumu metodes} publiskā statiskā klase Double pagarina Ellipse2D īsteno Serializable {public double x, y, width, height; public Double () {} public Double (double x, double y, double w, double h) {setFrame (x, y, w, h); } public double getX () {return x; } // papildu gadījuma metodes} publiskā būla vērtība satur (double x, double y) {// ...} // papildu gadījumu metodes, ko koplieto Float, Double un citas // Ellipse2D apakšklases} 

The Peldēt un Dubultā klases pagarina Ellipse2D, nodrošinot peldošā komata un dubultās precizitātes peldošo punktu Ellipse2D ieviešana. Izstrādātāji izmanto Peldēt lai samazinātu atmiņas patēriņu, jo īpaši tāpēc, ka, lai izveidotu vienu 2D ainu, jums var būt nepieciešami tūkstošiem vai vairāk šo objektu. Mēs izmantojam Dubultā kad nepieciešama lielāka precizitāte.

Jūs nevarat instantēt abstraktu Ellipse2D klasē, bet jūs varat arī instant Peldēt vai Dubultā. Jūs varat arī pagarināt Ellipse2D lai aprakstītu pielāgotu formu, kuras pamatā ir elipse.

Pieņemsim, ka vēlaties ieviest a Circle2D klase, kuras nav java.awt.geom iepakojums. Šis koda fragments parāda, kā jūs izveidotu Ellipse2D objekts ar peldošā komata ieviešanu:

 Ellipse2D e2d = jauns Ellipse2D.Float (10.0f, 10.0f, 20.0f, 30.0f); 

Nākamais koda fragments parāda, kā jūs izveidotu Ellipse2D objekts ar dubultprecīzu peldošā komata realizāciju:

 Ellipse2D e2d = jauns Ellipse2D.Double (10,0, 10,0, 20,0, 30,0); 

Tagad jūs varat izmantot jebkuru no metodēm, kas deklarētas Peldēt vai Dubultā izmantojot atsauces metodi Ellipse2D atsauce (piem., e2d.getX ()). Tādā pašā veidā jūs varētu izmantot jebkuru no kopīgajām metodēm Peldēt un Dubultā, un kas ir deklarēti Ellipse2D. Piemērs ir:

 e2d. satur (2.0, 3.0) 

Tas pabeidz ievadu par statiskām dalībnieku klasēm. Tālāk mēs aplūkosim iekšējās klases, kas ir statiskas dalībnieku klases, vietējās klases vai anonīmas klases. Jūs uzzināsiet, kā strādāt ar visiem trim iekšējās klases tipiem.

lejupielādēt Iegūt kodu Lejupielādējiet šīs apmācības piemēru avota kodu. Izveidoja Jeff Friesen JavaWorld.

Iekšējās klases, 1. tips: Nestaatiskas dalībnieku klases

Jūs esat iepriekš iemācījies Java 101 sērija par to, kā nedeklarētus (instances) laukus, metodes un konstruktorus pasludināt par klases biedriem. Jūs varat arī deklarēt nestacionāras dalībnieku klases, kas ir ligzdotas nestatiskas klases, kuras jūs deklarējat vienā līmenī ar instances laukiem, metodēm un konstruktoriem. Apsveriet šo piemēru:

 C klase {int f; tukšums m () {} C () {f = 2; } D klase {// dalībnieki}} 

Šeit mēs iepazīstinām ar augstākā līmeņa klasi C ar instances lauku f, instances metode m (), konstruktora un statisko dalībnieku klase D. Visas šīs vienības ir klases locekļi C, kas tos norobežo. Tomēr atšķirībā no iepriekšējā piemēra šīs instances vienības ir saistītas ar gadījumiC nevis ar C klase pati.

Katrs statiskās dalībnieku klases gadījums ir netieši saistīts ar tā norobežojošās klases gadījumu. Non-static member klases instanču metodes var izsaukt norobežojošās klases instanču metodes un piekļūt tās instances laukiem. Lai parādītu šo piekļuvi, 3. sarakstā tiek deklarēts EnclosingClass ar ligzdotu NSMClass.

Uzskaitīšana 3. Deklarējiet pievienojošo klasi ar ligzdotu, ne statisku dalībnieku klasi (EnclosingClass.java, 2. versija)

 klase EnclosingClass {privātā virkne s; private void m () {System.out.println (s); } klase NSMClass {void accessEnclosingClass () {s = "Zvanīts no NSMClass metodes accessEnclosingClass ()"; m (); }}} 

3. sarakstā tiek pasludināta augstākā līmeņa klase ar nosaukumu EnclosingClass ar instances lauku s, instances metode m ()un statisko dalībnieku klase NSMClass. Turklāt NSMClass deklarē instances metodi accessEnclosingClass ().

Tā kā accessEnclosingClass () nav statisks, NSMClass pirms šīs metodes izsaukšanas ir jāpastiprina. Šai instantācijai jānotiek, izmantojot EnclosingClass, kā parādīts 4. sarakstā.

Saraksts 4. NSMCDemo.java

 public class NSMCDemo {public static void main (String [] args) {EnclosingClass ec = new EnclosingClass (); ec.new NSMClass (). accessEnclosingClass (); }} 

Uzskaita 4 galvenais () metode vispirms acumirklī EnclosingClass un saglabā atsauci lokālajā mainīgajā ek. The galvenais () pēc tam metode izmanto EnclosingClass atsauce kā prefikss uz jauns operatoru, lai momentāni NSMClass. The NSMClass atsauce tiek izmantota, lai piezvanītu accessEnclosingClass ().

Vai man vajadzētu lietot “new” ar norādi uz norobežojošo klasi?

Prefiksēšana jauns ar norādi uz norobežojošo klasi ir reti. Tā vietā jūs parasti izsauksit slēgtas klases konstruktoru no konstruktora vai tā norobežojošās klases instances metodes.

Apkopojiet 3. un 4. ierakstu šādi:

 javac * .java 

Apkopojot pievienojošo klasi, kurā ir dalībnieku klase, kas nav statiska, sastādītājs izveido klases failu nematiskai dalībnieku klasei, kuras nosaukums sastāv no tās pievienojošās klases nosaukuma, dolāra zīmes rakstzīmes un klases, kas nav statisks. nosaukums. Šajā gadījumā apkopojot rezultātus EnclosingClass $ NSMCClass.class un EnclosingClass.class.

Palaidiet lietojumprogrammu šādi:

 java NSMCDemo 

Jums jāievēro šāda izeja:

 Izsaukts no NSMClass accessEnclosingClass () metodes 

Kad (un kā) to kvalificēt

Slēgtas klases kods var iegūt atsauci uz tā norobežojošās klases instanci, kvalificējot rezervēto vārdu šo ar pievienotās klases nosaukumu un dalībnieka piekļuves operatoru (.). Piemēram, ja kods iekš accessEnclosingClass () nepieciešams, lai iegūtu atsauci uz to EnclosingClass piemēram, tas precizētu EnclosingClass.šī. Tā kā kompilators ģenerē kodu šī uzdevuma veikšanai, šī prefiksa norādīšana notiek reti.

Piemērs: Nehematiskas dalībnieku klases HashMap

Standarta klases bibliotēkā ietilpst gan statiskas, gan statiskas dalībnieku klases. Šajā piemērā mēs aplūkosim HashMap klase, kas ir daļa no Java kolekciju ietvara java.util iepakojums. HashMap, kas apraksta kartes hash tabulas balstītu ieviešanu, ietver vairākas statiskas dalībnieku klases.

Piemēram, KeySet non-static member class apraksta kopas skats no kartē iekļautajiem taustiņiem. Šis koda fragments attiecas uz pievienoto KeySet klase uz to HashMap norobežojošā klase:

 publiskā klase HashMap paplašina AbstractMap ieviešanu Map, Cloneable, Serializable {// dažādi dalībnieki gala klase KeySet paplašina AbstractSet {// dažādi dalībnieki} // dažādi dalībnieki} 

The un sintakse ir piemēri sugas, saistītu valodu funkciju komplekts, kas kompilatoram palīdz ieviest tipa drošību. Es iepazīstināšu ar vispārējiem medikamentiem gaidāmajā Java 101 apmācība. Pagaidām jums vienkārši jāzina, ka šīs sintakses palīdz kompilatoram ieviest galveno objektu veidu, ko var saglabāt kartē un tastatūrā, kā arī vērtību objektu veidu, kurus var saglabāt kartē.

HashMap nodrošina a keySet () metode, kas instantizē KeySet kad nepieciešams, un atgriež šo gadījumu vai kešatmiņā saglabāto gadījumu. Lūk, visa metode:

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