1. Indre klasser

Du har for nylig lært, at der er statiske variable og statiske metoder. Det viser sig, at der også er statiske klasser. Men vi vil nærme os dette emne på afstand.

I Java har du helt lov til at erklære klasser inden for klasser. Og endda klasser inden for klasser, der er inden for klasser inden for klasser. Det hele ser meget simpelt ud:

class OuterClass
{
   variables of the class
   methods of the class

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

Vi erklærer bare en klasse i en anden. Så simpelt som det.

Eksempel:

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

Indlejrede klasser kan være statiske eller ikke-statiske. Statiske indlejrede klasser kaldes simpelthen statiske indlejrede klasser . Ikke-statiske indlejrede klasser kaldes indre klasser ( indre klasser ).



2. Statiske klasser

Statiske indlejrede klasser kan bruges uden for deres ydre klasse. Hvis en sådan klasse har public access modifier, så kan den bruges hvor som helst i programmet. Sådanne klasser kan næsten ikke skelnes fra nogen almindelig klasse. Men der er et par forskelle.

Klassenavn

Hvis du vil henvise til en statisk indlejret klasse fra et andet sted end dens ydre klasse, skal du angive klassenavnet, som består af navnet på den ydre klasse og navnet på den indlejrede klasse. Her er det generelle udseende af dette navn:

OuterClass.InnerClass

Eksempler:

Ydre klasse Indlejret klasse Fulde navn på den indlejrede klasse
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

Hvis en indlejret klasse har sin egen indlejrede klasse, sammenføjes deres navne simpelthen ved hjælp af en prik.

Et typisk eksempel på en indlejret klasse i JDK er Entryklassen inde i Mapklassen. Hvis du ønsker at få sættet af nøgleværdi-par gemt i et HashMapobjekt, så brug entrySet()metoden, som returnerer en .Set<Map.Entry>

Bemærk, at det er et eksempel på en ydre klasse og en indlejret klasse.Map.Entry

Oprettelse af et objekt

Det er meget nemt at oprette et objekt af en statisk indlejret klasse. Sådan ser det ud:

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

Det er det samme som med almindelige klasser, men navnet består af to dele.

Kalder statiske metoder

Hvis en statisk klasse har statiske metoder, kan du få adgang til dem på samme måde som de statiske metoder i almindelige klasser (men klassenavnet vil bestå af to dele).

OuterClass.NestedClass.staticMethod();

Adgang til statiske variabler

Det er også nemt at få adgang til de offentlige statiske variabler i en indlejret klasse:

OuterParent.NestedClass.nameOfStaticVariable


3. Funktioner af statiske klasser

Statiske indlejrede klasser har den mindste grund til at blive kaldt statiske. De opfører sig ligesom almindelige klasser . Der er ingen begrænsninger for at få adgang til dem fra ikke-statiske metoder.

Hvis du arbejder med en statisk indlejret klasse inde i dens ydre klasse, vil du ikke bemærke nogen forskel fra den mest almindelige (ikke indlejrede og ikke statiske) klasse.

Eksempel:

Statisk indlejret punktklasse Almindelig punktklasse.
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;
}

Hvis du tager en statisk indlejret klasse og flytter den ud af dens ydre klasse, er det eneste, der vil ændre sig, at den nye klasse ikke længere vil være i stand til at få adgang til private staticvariablerne og metoderne fra dens tidligere ydre klasse.

Eksempel:

Statisk indlejret punktklasse Almindelig punktklasse.
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);
   }
}

Metoden maini den almindelige Pointklasse kan ikke få adgang til private static pointsklassens variable Solution!

Dette er hovedforskellen mellem en statisk indlejret klasse og en almindelig klasse. Metoder i en statisk indlejret klasse kan få adgang til alle statiske variabler og metoder i deres ydre klasse, selvom de er erklæret private.

Og hvis du tænker over det, hvorfor skulle det så være overraskende? Modifikatoren privatesiger eksplicit, at de variabler og metoder, der er markeret med denne modifikator, kun kan tilgås fra deres klasse. Er en statisk indlejret klasse inde i dens ydre klasse? Ja, så intet problem! Få adgang til dem så meget du vil.