V tej vadnici boste s pomočjo primerov spoznali ugnezdeni statični razred. Spoznali boste tudi, kako se statični razredi razlikujejo od notranjih.
Kot smo se naučili v prejšnjih vajah, imamo lahko razred v drugem razredu v Javi. Takšni razredi so znani kot ugnezdeni razredi. V Javi so ugnezdeni razredi dveh vrst:
- Vgnezdeni nestatični razred (notranji razred)
- Vgnezdeni statični razred.
V prejšnji vadnici smo že razpravljali o notranjih tečajih. Če želite izvedeti več o notranjih razredih, obiščite Java Nested Class.
V tej vadnici bomo spoznali ugnezdene statične razrede.
Java ugnezdeni statični razred
Ključno besedo uporabljamo static
za izdelavo ugnezdenega razreda statično.
Opomba: V Javi smejo biti samo ugnezdeni razredi statični.
Tako kot običajni razredi lahko tudi statični ugnezdeni razredi vključujejo tako statična kot nestatična polja in metode. Na primer
Class Animal ( static class Mammal ( // static and non-static members of Mammal ) // members of Animal )
Statični ugnezdeni razredi so povezani z zunanjim razredom.
Za dostop do statičnega ugnezdenega razreda ne potrebujemo predmetov zunanjega razreda.
Primer: Statični ugnezdeni razred
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(); ) )
Izhod
Jaz sem plazilec. Sem sesalec.
V zgornjem programu imamo v razredu Animal dva ugnezdena razreda Sesalci in Plazilci.
Za ustvarjanje predmeta nestatičnega razreda Reptile smo uporabili
Animal.Reptile reptile = animal.new Reptile()
Za izdelavo predmeta statičnega razreda Sesalci smo uporabili
Animal.Mammal mammal = new Animal.Mammal()
Dostop do članov zunanjega razreda
V Javi so statični ugnezdeni razredi povezani z zunanjim razredom. Zato lahko statični ugnezdeni razredi dostopajo samo do članov razreda (statična polja in metode) zunanjega razreda.
Poglejmo, kaj se bo zgodilo, če bomo poskušali dostopati do nestatičnih polj in metod zunanjega razreda.
Primer: Dostop do nestatičnih članov
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(); ) )
Izhod
Main.java:28: napaka: ni mogoče najti simbola mammal.eat (); simbol: metoda eat () lokacija: spremenljiv sesalec tipa Sesalci 1 stanje izstopa prevajalnika napak 1
V zgornjem primeru smo eat()
znotraj razreda Animal ustvarili nestatično metodo .
Če poskusimo dostopiti eat()
s pomočjo predmeta sesalec, prevajalnik pokaže napako.
To je zato, ker je sesalec predmet statičnega razreda in iz statičnih razredov ne moremo dostopati do nestatičnih metod.
Statični razred najvišje ravni
Kot smo že omenili, so lahko statični samo ugnezdeni razredi. Ne moremo imeti statičnih razredov na najvišji ravni.
Poglejmo, kaj se bo zgodilo, če poskusimo narediti razred najvišje ravni statičen.
static class Animal ( public static void displayInfo() ( System.out.println("I am an animal"); ) ) class Main ( public static void main(String() args) ( Animal.displayInfo(); ) )
Izhod
Main.java:1: napaka: statični modifikator tukaj ni dovoljen statični razred Animal (1 stanje izstopa prevajalnika napak 1
V zgornjem primeru smo poskušali ustvariti statični razred Animal. Ker Java ne dovoljuje statičnega razreda najvišje ravni, bomo dobili napako.