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 uzSMClass
'saccessEnclosingClass ()
metode prasaSMClass.
prefikss, joaccessEnclosingClass ()
tiek deklarētsstatisks
.accessEnclosingClass ()
var piekļūtEnclosingClass
'ss
lauku un izsauciet tom1 ()
metodi, lai gan abi ir deklarētiPrivā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: