Tässä opetusohjelmassa opit sisäkkäisistä staattisista luokista esimerkkien avulla. Opit myös siitä, kuinka staattiset luokat eroavat sisäisistä luokista.
Kuten edellisistä opetusohjelmista on opittu, meillä voi olla luokka toisen Java-luokan sisällä. Tällaisia luokkia kutsutaan sisäkkäisiksi luokiksi. Java-tilassa sisäkkäisiä luokkia on kahta tyyppiä:
- Sisäkkäinen ei-staattinen luokka (sisempi luokka)
- Sisäkkäinen staattinen luokka.
Olemme jo keskustelleet sisäisistä luokista edellisessä opetusohjelmassa. Käy Java Nested -luokassa, jos haluat oppia sisäisistä luokista.
Tässä opetusohjelmassa opitaan sisäkkäisistä staattisista luokista.
Java sisäkkäin staattinen luokka
Teemme avainsanalla static
sisäkkäisen luokan staattiseksi.
Huomaa: Javassa vain sisäkkäiset luokat ovat staattisia.
Tavallisten luokkien tavoin staattiset sisäkkäiset luokat voivat sisältää sekä staattisia että ei-staattisia kenttiä ja menetelmiä. Esimerkiksi,
Class Animal ( static class Mammal ( // static and non-static members of Mammal ) // members of Animal )
Staattiset sisäkkäiset luokat liittyvät ulompaan luokkaan.
Staattisen sisäkkäisen luokan käyttämiseksi emme tarvitse ulomman luokan esineitä.
Esimerkki: Staattinen sisäkkäinen luokka
class Animal ( // inner class class Reptile ( public void displayInfo() ( System.out.println("I am a reptile."); ) ) // static class static class Mammal ( public void displayInfo() ( System.out.println("I am a mammal."); ) ) ) class Main ( public static void main(String() args) ( // object creation of the outer class Animal animal = new Animal(); // object creation of the non-static class Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); // object creation of the static nested class Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); ) )
Tuotos
Olen matelija. Olen nisäkäs.
Yllä olevassa ohjelmassa meillä on kaksi sisäkkäistä luokan nisäkäs ja matelija luokan eläin sisällä.
Olemme luoneet ei-staattisen luokan matelija objektin
Animal.Reptile reptile = animal.new Reptile()
Olemme luoneet staattisen luokan Nisäkäs objektin
Animal.Mammal mammal = new Animal.Mammal()
Pääsy ulkoluokan jäseniin
Java-tilassa staattiset sisäkkäiset luokat liitetään ulompaan luokkaan. Siksi staattiset sisäkkäiset luokat voivat käyttää vain ulomman luokan luokan jäseniä (staattiset kentät ja menetelmät).
Katsotaanpa, mitä tapahtuu, jos yritämme käyttää ei-staattisia kenttiä ja ulomman luokan menetelmiä.
Esimerkki: Ei-staattisten jäsenten käyttö
class Animal ( static class Mammal ( public void displayInfo() ( System.out.println("I am a mammal."); ) ) class Reptile ( public void displayInfo() ( System.out.println("I am a reptile."); ) ) public void eat() ( System.out.println("I eat food."); ) ) class Main ( public static void main(String() args) ( Animal animal = new Animal(); Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); mammal.eat(); ) )
Tuotos
Main.java:28: virhe: ei löydy symbolia mammal.eat (); symboli: menetelmä syö () sijainti: vaihteleva nisäkäs tyyppiä Nisäkäs 1 -virheen kääntäjän poistumistila 1
Yllä olevassa esimerkissä olemme luoneet ei-staattisen menetelmän eat()
Animal-luokkaan.
Jos yritämme nyt käyttää eat()
objektinisäkkäitä, kääntäjä näyttää virheen.
Se johtuu siitä, että nisäkäs on staattisen luokan kohde, emmekä voi käyttää ei-staattisia menetelmiä staattisista luokista.
Staattinen ylätason luokka
Kuten edellä mainittiin, vain sisäkkäiset luokat voivat olla staattisia. Meillä ei voi olla staattisia ylätason luokkia.
Katsotaanpa, mitä tapahtuu, jos yritämme tehdä huipputason staattisen.
static class Animal ( public static void displayInfo() ( System.out.println("I am an animal"); ) ) class Main ( public static void main(String() args) ( Animal.displayInfo(); ) )
Tuotos
Main.java:1: virhe: staattinen muokkaaja ei ole sallittu tässä staattinen luokka Animal (1 virheen kääntäjän poistumistila 1
Yllä olevassa esimerkissä olemme yrittäneet luoda staattisen luokan eläin. Koska Java ei salli staattista ylätason luokkaa, saamme virheen.