1. Klasy wewnętrzne

Niedawno dowiedziałeś się, że istnieją zmienne statyczne i metody statyczne, ale okazuje się, że są też klasy statyczne. Ale zacznijmy trochę z daleka.

W języku Java deklarowanie klas w ramach klas jest całkowicie możliwe. A nawet klasy w klasach, które są w klasach w klasach. Wszystko wygląda na bardzo proste:

class ВнешнийКласс
{
   переменные класса
   методы класса

   class ВнутреннийКласс
   {
      переменные класса
      методы класса
   }
}

Po prostu deklarujemy jedną klasę wewnątrz drugiej - i to wszystko.

Przykład:

public class Solution
{
   static ArrayList<Point> points = new ArrayList<Point>();

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points.add(point);
   }

   static class Point
   {
      int x;
      int y;
   }
}

Klasy wewnętrzne są statyczne lub niestatyczne. Klasy statyczne są również nazywane zagnieżdżonymi ( static nested class ), niestatyczne są po prostu nazywane klasami wewnętrznymi ( inner class ).



2. Klasy statyczne

Klasy zagnieżdżone statycznie mogą być używane poza klasą nadrzędną. Jeśli taka klasa ma modyfikator dostępu publicznego, może być używana w dowolnym miejscu w programie. Takie klasy w rzeczywistości nie różnią się od zwykłych klas. Chociaż istnieje kilka różnic.

Nazwa klasy

Jeśli chcesz odwołać się do statycznej klasy zagnieżdżonej nie z jej klasy nadrzędnej, ale z innego miejsca w programie, musisz określić nazwę klasy: składa się ona z nazwy klasy nadrzędnej i nazwy klasy zagnieżdżonej. Ogólna forma tej nazwy jest następująca:

КлассРодитель.ВложенныйКласс

Przykłady:

Klasa nadrzędna klasa zagnieżdżona W pełni kwalifikowana nazwa klasy zagnieżdżonej
com.codegym.Solution
Point
com.codegym.Solution.Point
java.util.Map
Entry
java.util.Map.Entry
java.util.Files
DirectoryStream
java.util.Files.DirectoryStream
java.nio.WindowsPath
Closeable
java.nio.WindowsPath.Closeable

Jeśli klasa zagnieżdżona ma swoją własną klasę zagnieżdżoną, ich nazwy są po prostu sklejone kropką.

Typowym przykładem klasy zagnieżdżonej w JDK jest klasa Entry wewnątrz klasy Map . Jeśli chcesz uzyskać zestaw par elementów z obiektu HashMap, metoda entrySet()zwróci ci zestaw par elementów typu .Set<Map.Entry>

Oto wpis - jest to klasa zewnętrzna i wewnętrzna.Map.Entry

Utwórz obiekt

Tworzenie obiektu zagnieżdżonej klasy statycznej jest bardzo proste. To wygląda tak:

КлассРодитель.ВложенныйКласс Nazwa = new КлассРодитель.ВложенныйКласс();

Wszystko, jak przy zwykłych klasach, tylko nazwa jest podwójna.

Wywoływanie metod statycznych

Jeśli klasa statyczna ma metody statyczne, można uzyskać do nich dostęp w taki sam sposób, jak w przypadku metod statycznych zwykłych klas (tylko nazwa klasy jest teraz podwójna).

КлассРодитель.ВложенныйКласс.статическийМетод();

Dostęp do zmiennych statycznych

Dostęp do publicznych zmiennych statycznych zagnieżdżonej klasy jest również łatwy:

КлассРодитель.ВложенныйКласс.NazwaСтатическойПеременной


3. Cechy klas statycznych

Statyczne klasy wewnętrzne są najmniej warte nazywania statycznymi. Zachowują się dokładnie tak, jak normalne klasy . Nie ma żadnych ograniczeń w dostępie do nich z metod niestatycznych.

Jeśli pracujesz z wewnętrzną klasą statyczną wewnątrz jej klasy nadrzędnej, nie zauważysz żadnej różnicy w stosunku do tego, czy ta klasa wewnętrzna była zwykłą klasą (nie zagnieżdżoną ani statyczną).

Przykład:

Wewnętrzna klasa statyczna Punkt Zwykła klasa Punkt
public class Solution
{
   static ArrayList<Point> points;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points = new ArrayList<Point>();
      points.add(point);
   }

   static class Point
   {
      int x;
      int y;
   }
}
public class Solution
{
   static ArrayList<Point> points;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points = new ArrayList<Point>();
      points.add(point);
   }
}

class Point
{
   int x;
   int y;
}

Jeśli weźmiesz jakąś zagnieżdżoną klasę statyczną i usuniesz ją z jej klasy nadrzędnej, wszystko, co się zmieni, to to, że nowa klasa nie będzie już mogła uzyskać dostępu do private staticzmiennych i metod poprzedniej klasy nadrzędnej.

Przykład:

Wewnętrzna klasa statyczna Punkt Zwykła klasa Punkt
public class Solution
{
   private static ArrayList<Point> points;

   static class Point
   {
      int x;
      int y;

      public static void main(String[] args)
      {
         Point point = new Point();
         point.x = 100;
         point.y = 200;

         // будет работать
         points = new ArrayList<Point>();
         points.add(point);
      }
   }
}
public class Solution
{
   private static ArrayList<Point> points;
}

class Point
{
   int x;
   int y;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;

      // тут будет ошибка
      points = new ArrayList<Point>();
      points.add(point);
   }
}

Metoda mainw zwykłej klasie Point nie może uzyskać dostępu do private staticzmiennej pointsklasy Solution!

W rzeczywistości jest to główna różnica między zagnieżdżoną klasą statyczną a zwykłą klasą. Metody zagnieżdżonej klasy statycznej mają dostęp do wszystkich zmiennych statycznych i metod swojej klasy nadrzędnej, nawet jeśli są zadeklarowane private.

Cóż, jeśli to rozgryziesz, co w tym takiego zaskakującego? Modyfikator privatewyraźnie stwierdza, że ​​do zmiennych i metod wyznaczonych przez ten modyfikator można uzyskać dostęp tylko z poziomu ich klasy. Wewnętrzna klasa statyczna znajduje się w klasie nadrzędnej? Tak, więc nie ma problemu: kontaktuj się tyle, ile chcesz.