Statikus osztályok

All lectures for HU purposes
Szint, Lecke
Elérhető

1. Belső osztályok

Nemrég tanulta meg, hogy vannak statikus változók és statikus módszerek. Kiderült, hogy vannak statikus osztályok is. De ezt a témát távolról közelítjük meg.

A Java-ban teljes mértékben megengedett az osztályok osztályokon belüli deklarálása. És még az osztályokon belüli osztályok is, amelyek az osztályokon belül vannak. Minden nagyon egyszerűnek tűnik:

class OuterClass
{
   variables of the class
   methods of the class

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

Csak deklaráljuk az egyik osztályt a másikban. Ilyen egyszerű az egész.

Példa:

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

A beágyazott osztályok lehetnek statikusak vagy nem statikusak. A statikus beágyazott osztályokat egyszerűen statikus beágyazott osztályoknak nevezzük . A nem statikus beágyazott osztályokat belső osztályoknak ( inner class ) nevezzük .



2. Statikus osztályok

A statikus beágyazott osztályok a külső osztályukon kívül is használhatók. Ha egy ilyen osztály rendelkezik a nyilvános hozzáférés módosítóval, akkor a programban bárhol használható. Az ilyen osztályok szinte megkülönböztethetetlenek minden hétköznapi osztálytól. De van egy-két különbség.

Osztály név

Ha egy statikus beágyazott osztályra a külső osztályon kívül máshonnan szeretne hivatkozni, meg kell adnia az osztály nevét, amely a külső osztály nevéből és a beágyazott osztály nevéből áll. Íme a név általános megjelenése:

OuterClass.InnerClass

Példák:

Külső osztály Beágyazott osztály A beágyazott osztály teljes neve
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

Ha egy beágyazott osztálynak saját beágyazott osztálya van, akkor a nevüket egyszerűen egy ponttal egyesítik.

A JDK beágyazott osztályának tipikus példája az Entryosztályon belüli Maposztály. Ha szeretné lekérni a kulcs-érték párok készletét egy objektumban HashMap, akkor használja a entrySet()metódust, amely egy .Set<Map.Entry>

Vegye figyelembe, hogy ez egy példa egy külső osztályra és egy beágyazott osztályra.Map.Entry

Objektum létrehozása

Nagyon egyszerű létrehozni egy statikus beágyazott osztály objektumát. Így néz ki:

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

Ugyanaz, mint a hagyományos osztályoknál, de a név két részből áll.

Statikus metódusok hívása

Ha egy statikus osztálynak vannak statikus metódusai, akkor ezeket ugyanúgy érheti el, mint a közönséges osztályok statikus metódusait (de az osztálynév két részből áll).

OuterClass.NestedClass.staticMethod();

Statikus változók elérése

A beágyazott osztály nyilvános statikus változóinak elérése is egyszerű:

OuterParent.NestedClass.nameOfStaticVariable


3. A statikus osztályok jellemzői

A statikus beágyazott osztályoknak van a legkevesebb oka statikusnak nevezni őket. Úgy viselkednek, mint a szokásos osztályok . Nincs korlátozás a nem statikus metódusokból történő elérésére.

Ha statikus beágyazott osztállyal dolgozik a külső osztályán belül, akkor nem fog észrevenni különbséget a legáltalánosabb (nem beágyazott és nem statikus) osztályhoz képest.

Példa:

Statikus beágyazott pont osztály Rendes pont osztály.
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;
}

Ha veszünk egy statikus beágyazott osztályt, és áthelyezzük a külső osztályából, akkor csak az fog változni, hogy az új osztály többé nem fogja tudni elérni a private statickorábbi külső osztály változóit és metódusait.

Példa:

Statikus beágyazott pont osztály Rendes pont osztály.
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);
   }
}

A mainközönséges Pointosztály metódusa nem fér hozzá private static pointsaz osztály változójához Solution!

Ez a fő különbség a statikus beágyazott osztály és a közönséges osztály között. A statikus beágyazott osztályok metódusai hozzáférhetnek külső osztályuk összes statikus változójához és metódusához, még akkor is, ha deklarálva vannak private.

És ha belegondolsz, miért lenne ez meglepő? A privatemódosító kifejezetten azt mondja, hogy az ezzel a módosítóval megjelölt változók és metódusok csak az osztályukon belül érhetők el. A statikus beágyazott osztály a külső osztályán belül van? Igen, szóval semmi gond! Annyira érheti el őket, amennyit csak akar.


Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION