1. Inner classes

Nalaman mo kamakailan na may mga static na variable at static na pamamaraan. Ito ay lumiliko na mayroon ding mga static na klase. Ngunit lalapitan natin ang paksang ito mula sa malayo.

Sa Java, ganap kang pinapayagang magdeklara ng mga klase sa loob ng mga klase. At maging ang mga klase sa loob ng mga klase na nasa loob ng mga klase sa loob ng mga klase. Ang lahat ay mukhang napaka-simple:

class OuterClass
{
   variables of the class
   methods of the class

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

Nagdedeklara lang kami ng isang klase sa loob ng isa pa. As simple as that.

Halimbawa:

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

Ang mga nested na klase ay maaaring static o non-static. Ang mga static na nested na klase ay tinatawag na mga static na nested na klase . Ang mga non-static na nested na klase ay tinatawag na mga panloob na klase ( mga panloob na klase ).



2. Mga static na klase

Maaaring gamitin ang mga static na nested na klase sa labas ng kanilang panlabas na klase. Kung ang naturang klase ay may pampublikong access modifier, maaari itong magamit kahit saan sa programa. Ang ganitong mga klase ay halos hindi nakikilala sa anumang ordinaryong klase. Ngunit mayroong ilang mga pagkakaiba.

Pangalan ng klase

Kung gusto mong sumangguni sa isang static na nested na klase mula sa isang lugar maliban sa panlabas na klase nito, kailangan mong tukuyin ang pangalan ng klase, na binubuo ng pangalan ng panlabas na klase at ang pangalan ng nested na klase. Narito ang pangkalahatang hitsura ng pangalang ito:

OuterClass.InnerClass

Mga halimbawa:

Outer class Nested na klase Buong pangalan ng nested class
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

Kung ang isang nested class ay may sarili nitong nested class, ang kanilang mga pangalan ay isasama lang gamit ang isang tuldok.

Ang karaniwang halimbawa ng isang nested na klase sa JDK ay ang Entryklase sa loob ng Mapklase. Kung nais mong makuha ang hanay ng mga pares ng key-value na naka-imbak sa isang HashMapbagay, pagkatapos ay gamitin ang entrySet()pamamaraan, na nagbabalik ng isang .Set<Map.Entry>

Tandaan na ito ay isang halimbawa ng isang panlabas na klase at isang nested na klase.Map.Entry

Paglikha ng isang bagay

Napakadaling gumawa ng object ng isang static na nested class. Ganito ang hitsura nito:

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

Pareho lang ito sa mga ordinaryong klase, ngunit ang pangalan ay binubuo ng dalawang bahagi.

Pagtawag ng mga static na pamamaraan

Kung ang isang static na klase ay may mga static na pamamaraan, maaari mong ma-access ang mga ito sa parehong paraan tulad ng mga static na pamamaraan ng mga ordinaryong klase (ngunit ang pangalan ng klase ay binubuo ng dalawang bahagi).

OuterClass.NestedClass.staticMethod();

Pag-access sa mga static na variable

Madali din ang pag-access sa mga pampublikong static na variable ng isang nested class:

OuterParent.NestedClass.nameOfStaticVariable


3. Mga tampok ng mga static na klase

Ang mga static na nested na klase ay may pinakamababang dahilan para tawaging static. Sila ay kumikilos tulad ng mga regular na klase . Walang mga paghihigpit sa pag-access sa mga ito mula sa mga non-static na pamamaraan.

Kung nagtatrabaho ka sa isang static na nested na klase sa loob ng panlabas na klase nito, hindi mo mapapansin ang anumang pagkakaiba mula sa pinakakaraniwan (hindi nested at hindi static) na klase.

Halimbawa:

Static na nested Point class Klase ng Ordinaryong Punto.
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;
}

Kung kukuha ka ng ilang static na nested class at ililipat ito sa panlabas na klase nito, ang magbabago lang ay hindi na maa-access ng bagong klase ang private staticmga variable at pamamaraan ng dating panlabas na klase nito.

Halimbawa:

Static na nested Point class Klase ng Ordinaryong Punto.
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);
   }
}

Ang mainpamamaraan sa ordinaryong Pointklase ay hindi ma-access ang private static pointsvariable ng Solutionklase!

Ito ang pangunahing pagkakaiba sa pagitan ng isang static na nested na klase at isang ordinaryong klase. Ang mga pamamaraan ng isang static na nested na klase ay maaaring ma-access ang lahat ng mga static na variable at pamamaraan ng kanilang panlabas na klase, kahit na sila ay idineklara private.

At kung iisipin mo, bakit ito nakakagulat? Malinaw na sinasabi ng privatemodifier na ang mga variable at pamamaraan na minarkahan ng modifier na ito ay maa-access lamang mula sa loob ng kanilang klase. Ang isang static na nested na klase ba ay nasa loob ng panlabas na klase nito? Oo, kaya walang problema! I-access ang mga ito hangga't gusto mo.