Java - Ugnježdene statičke klasa u Javi (Nested Static Class)


U ovoj lekciji ćete pomoću primjera naučiti o ugnježdenoj statičkoj klasi. Naučićete i kako se statičke klase razlikuju od unutrašnjih klasa. Kao što smo naučili iz prethodnih lekcija, klasu možemo imati unutar druge klase u Javi. Takve klase su poznate kao ugnježdene klase. U Javi postoje dvije vrste ugnježdenih klasa:

  • Ugnježdene nestatička klasa (unutrašnja klasa)
  • Ugnježdena statička klasa.

O unutrašnjim klasama smo već govorili u prethodnoj lekciji. Pogledajte lekciju o Java ugnježdenim klasama ako želite saznati više o unutrašnjim klasama (Inner class). U ovoj lekciji ćemo naučiti o ugnježdenim statičkim klasama.



Statička ugnježdena klasa u Javi

Mi koristimo ključnu riječ static da našu ugnježdenu klasu učinimo statičnom.

Kao i obične klase, statičke ugnježdene klase mogu uključivati i statička i nestatička polja i metode. Pogledajmo primjer:

Class Zivotinje{
   static class pas{
      // Statički i nestatični članovi psa
   }
   // Članovi životinja
} 

Statičke ugnježdene klase povezane su s vanjskom klasom. Za pristup statičkoj ugnježdenoj klasi ne trebaju nam objekti vanjske klase.


Primjer: Statička ugnježdena klasa

class Animal {

// inner class
   class Reptile {
      public void displayInfo() {
        System.out.println("Ja sam gmizavac.");
      }
   }

// static class
   static class Mammal {
      public void displayInfo() {
        System.out.println("Ja sam sisar.");
      }
   }
}

class Main {
   public static void main(String[] args) {
      // Kreiranje objekta vanjske klase
      Animal animal = new Animal();

      // Kreiranje objekta nestatičke klase
      Animal.Reptile reptile = animal.new Reptile();
      reptile.displayInfo();

      // Kreiranje objekta statičke ugnježdene klase
      Animal.Mammal mammal = new Animal.Mammal();
      mammal.displayInfo();

   }
}

U gornjem programu imamo dvije ugnježdene klase Mammal i Reptile unutar klase Animal. Za kreiranje nestatičke objekta klase Reptile koristili smo sljedeću liniju koda:

Animal.Reptile reptile = animal.new Reptile()


Pristupanje članovima vanjske klase

U Javi, statičke ugnježdene klase pridružene su vanjskoj klasi. Zbog toga statički ugnježdene klase mogu pristupiti samo članovima klase (statička polja i metode) vanjske klase. Pogledajmo što će se dogoditi ako pokušamo pristupiti nestatičnim poljima i metodama vanjske klase.


Primjer: Pristupanje statičkim članovima

class Animal {
  static class Mammal {
   public void displayInfo() {
     System.out.println("Ja sam sisar.");
   }
 }

 class Reptile {
   public void displayInfo() {
     System.out.println("Ja sam gmizavac.");
   }
 }

 public void eat() {
   System.out.println("Ja jedem hranu.");
 }
}

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();
 }
}

U gornjem primjeru stvorili smo nestatičku metodu eat() unutar klase Animal. Sada, ako pokušamo pristupiti metodi eat() pomoću objekta Mammal, kompajler prikazuje grešku. To je zato što je Mammal objekt statičke klase i ne možemo pristupiti nestatičkim metodama iz statičkih klasa.



Statička klasa najvišeg nivoa

Kao što je gore spomenuto, samo ugnježdene klase mogu biti statične. Ne možemo imati statičke klase najvišeg nivoa. Pogledajmo šta će se dogoditi ako klasu najvišeg nivoa pokušamo učiniti statičnom.

static class Animal {
 public static void displayInfo() {
   System.out.println("Ja sam životinja.");
 }
}

class Main {
 public static void main(String[] args) {
   Animal.displayInfo();
 }
}

Prikaz koda iz gornjeg primjera izgledaće ovako:

Main.java:1: error: modifier static not allowed here
static class Animal {
       ^
1 error
compiler exit status 1

U gornjem primjeru pokušali smo stvoriti statičku klasu Animal. Budući da Java ne dopušta statičku klasu najvišeg nivoa, dobićemo grešku.