1. Вътрешни класове

Наскоро научихте, че има статични променливи и статични методи. Оказва се, че има и статични класове. Но ще подходим към тази тема от дистанция.

В Java ви е напълно позволено да декларирате класове в класове. И дори класове в класове, които са в класове в класове. Всичко изглежда много просто:

class OuterClass
{
   variables of the class
   methods of the class

   class NestedClass
   {
      variables of the class
      methods of the class
   }
}

Просто декларираме един клас в друг. Толкова просто.

Пример:

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

Вложените класове могат да бъдат статични or нестатични. Статичните вложени класове се наричат ​​просто статични вложени класове . Нестатичните вложени класове се наричат ​​вътрешни класове ( вътрешни класове ).



2. Статични класове

Статичните вложени класове могат да се използват извън техния външен клас. Ако такъв клас има модификатора за публичен достъп, тогава той може да се използва навсякъде в програмата. Такива класове са почти неразличими от всеки обикновен клас. Но има няколко разлики.

Име на класа

Ако искате да се обърнете към статичен вложен клас от място, различно от неговия външен клас, трябва да посочите името на класа, което се състои от името на външния клас и името на вложения клас. Ето общия вид на това име:

OuterClass.InnerClass

Примери:

Външен клас Вложен клас Пълно име на вложения клас
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

Ако вложен клас има свой собствен вложен клас, техните имена просто се свързват с точка.

Типичен пример за вложен клас в JDK е Entryкласът вътре в Mapкласа. Ако искате да получите набор от двойки ключ-стойност, съхранени в HashMapобект, използвайте entrySet()метода, който връща .Set<Map.Entry>

Имайте предвид, че това е пример за външен клас и вложен клас.Map.Entry

Създаване на обект

Много е лесно да създадете обект от статичен вложен клас. Ето How изглежда:

OuterClass.NestedClass name = new OuterClass.NestedClass();

Всичко е същото като при обикновените класове, но името се състои от две части.

Извикване на статични методи

Ако статичен клас има статични методи, можете да получите достъп до тях по същия начин, Howто статичните методи на обикновените класове (но името на класа ще се състои от две части).

OuterClass.NestedClass.staticMethod();

Достъп до статични променливи

Достъпът до публичните статични променливи на вложен клас също е лесен:

OuterParent.NestedClass.nameOfStaticVariable


3. Характеристики на статичните класове

Статичните вложени класове имат най-малкото основание да се наричат ​​статични. Те се държат точно като обикновените класове . Няма ограничения за достъп до тях от нестатични методи.

Ако работите със статичен вложен клас вътре във външния му клас, няма да забележите разлика от най-обикновения (не вложен и не статичен) клас.

Пример:

Статичен вложен клас Point Обикновен клас точки.
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;
}

Ако вземете няHowъв статичен вложен клас и го преместите извън външния му клас, единственото нещо, което ще се промени е, че новият клас вече няма да има достъп до private staticпроменливите и методите на предишния външен клас.

Пример:

Статичен вложен клас Point Обикновен клас точки.
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;

         // This will work
         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;

      // This will generate an error
      points = new ArrayList<Point>();
      points.add(point);
   }
}

Методът mainв обикновения Pointклас няма достъп до private static pointsпроменливата на Solutionкласа!

Това е основната разлика между статичен вложен клас и обикновен клас. Методите на статичен вложен клас имат достъп до всички статични променливи и методи на своя външен клас, дори ако са декларирани private.

И ако се замислите, защо това трябва да е изненадващо? Модификаторът privateизрично казва, че променливите и методите, маркирани от този модификатор, могат да бъдат достъпни само от техния клас. Дали статичен вложен клас е във външния си клас? Да, значи няма проблем! Достъп до тях, колкото искате.