CodeGym /Kurslar /Java SELF AZ /Statik siniflər

Statik siniflər

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. İç içə siniflər

Yaxınlarda öyrəndiniz ki, statik dəyişənlər və statik metodlar var, amma məlum olur ki, həm də statik siniflər olur. Amma bir az uzaqdan başlayaq.

Java dilində tamamilə mümkündür ki, siniflərin içində siniflər elan edilsin. Hətta siniflərin içində olan, başqa siniflərin içində olan siniflər də. Bütün bunlar çox sadə görünür:

class XariciSinif
{
   sinif dəyişənləri
   sinif metodları 
   class DaxiliSinif
   {
      sinif dəyişənləri
      sinif metodları
   }
}

Sadəcə bir sinifi başqa bir sinifin içində elan edirik — vəssalam.

Nümunə:

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

Daxili siniflər statik və qeyri-statik ola bilər. Statik siniflərə əlavə olaraq daxili (static nested class) adı da verilir, qeyri-statik olanlara isə sadəcə daxili siniflər (inner class) deyilir.



2. Statik siniflər

Statik daxili siniflər öz valideyn sinifindən kənarda istifadə oluna bilər. Əgər belə sinifdə public giriş modifikatoru varsa, bunu proqramın istənilən yerində istifadə etmək olar. Belə siniflər əslində adi siniflərdən heç nə ilə fərqlənmir. Amma bir neçə fərq var.

Sinif adı

Əgər siz statik daxili sinifə onun valideyn sinifindən deyil, proqramdakı başqa bir yerdən müraciət etmək istəyirsinizsə, sinif adını göstərməli olacaqsınız: bu ad valideyn sinifin adı və daxili sinifin adından ibarətdir. Bu adın ümumi forması belədir:

ValideynSinif.DaxiliSinif

Nümunələr:

Valideyn sinif Daxili sinif Daxili sinifin tam adı
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

Əgər daxili sinifin öz daxili sinifi varsa, onların adları sadəcə nöqtə ilə birləşir.

JDK-da daxili sinifin tipik nümunəsi Entry sinifi Map sinifinin daxilindədir. Əgər siz HashMap obyektindən elementlərin cütlük dəstini əldə etmək istəyirsinizsə, entrySet() metodu sizə Set<Map.Entry> tipində cüt dəstə qaytaracaq.

Bu qeydiyyat Map.Entry — bu xarici və daxili siniflərdir.

Obyekti yaratmaq

Statik daxili sinifin obyektini yaratmaq çox asandır. Bu belə görünür:

ValideynSinif.DaxiliSinif ad = new ValideynSinif.DaxiliSinif();

Hamısı adi siniflərdə olduğu kimi, yalnız ad ikili.

Statik metodlara müraciət

Əgər statik sinifin statik metodları varsa, onlara adi siniflərin statik metodlarına müraciət etdiyi kimi müraciət etmək olar (yalnız sinifin adı indi ikilidir).

ValideynSinif.DaxiliSinif.statikMetod();

Statik dəyişənlərə müraciət

Daxili sinifin publik statik dəyişənlərinə müraciət etmək də asandır:

ValideynSinif.DaxiliSinif.statikDeyisenAdi


3. Statik siniflərin xüsusiyyətləri

Statik daxili sinifləri ən az statik adlandırmaq lazım idi. Onlar adi siniflər kimi davranır. Statik metodlardan onlara müraciət etmək üçün heç bir məhdudiyyət yoxdur.

Əgər siz daxili statik siniflə onun "valideyn" sinifinin daxilində işləyirsinizsə, onun adi sinifdən (nə daxili, nə də statik olan) fərqini ümumiyyətlə hiss etməyəcəksiniz.

Nümunə:

Daxili statik sinif Point Adi sinif 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;
}

Əgər hər hansı bir daxili statik sinifi götürüb onun valideyn sinifindən çıxarsanız, yalnız yeni sinif artıq keçmiş valideyn sinifin private static dəyişənlərinə və metodlarına müraciət edə bilməyəcək.

Nümunə:

Daxili statik sinif Point Adi sinif 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;

         // işləyəcək
         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;

      // burada xeta olacaq
      points = new ArrayList<Point>();
      points.add(point);
   }
}

Point adi sinifindəki main metodu Solution sinifinin private static points dəyişəninə müraciət edə bilmir!

Bu, əslində, statik daxili sinifin adi sinifdən əsas fərqidir. Statik daxili sinif metodları öz valideyn siniflərinin bütün statik dəyişənlərinə və metodlarına, hətta onlar private ilə işarələndikdə belə, müraciət edə bilər.

Eh, əgər bu məsələyə əhəmiyyət versək, burda təəccüblü nə var ki? private modifikatoru açıq şəkildə deyir ki, bu modifikatorla qeyd olunan dəyişənlərə və metodlara yalnız öz sinifləri daxilindən müraciət etmək olar. Statik daxili sinif valideyn sinifin daxilində yerləşir? Bəli, onda heç bir problem yoxdur: istədiyiniz qədər müraciət edin.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION