Statik Siniflər

All lectures for AZ purposes
Səviyyə , Dərs
Mövcuddur

1. Daxili Siniflər

Yaxın zamanda öyrəndiniz ki, statik dəyişənlər və statik metodlar mövcuddur, amma məlum olur ki, statik siniflər də varmış. Amma gəlin bir az da uzaqdan başlayaq.

Java dilində sinifləri başqa siniflərin içində də elan etmək mümkündür. Hətta siniflərin içindəki siniflərdə də siniflər elan edə bilərsiniz. Bu çox sadə görünür:

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

Bir sinifi digərinin 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ə ya statik olmayan ola bilir. Statik siniflərə başqa cür quraşdırılmış (static nested class) deyirlər, statik olmayanlar isə sadəcə daxili siniflər adlanır (inner class).



2. Statik Siniflər

Statik quraşdırılmış sinifləri öz analıq sinifindən kənarda da istifadə etmək olar. Belə bir sinifin public giriş modifikatoru varsa, onu proqramın istənilən yerində istifadə etmək olar. Belə siniflər faktiki olaraq adi siniflərdən heç nə ilə fərqlənmir. Ancaq bir neçə fərqlər var.

Sinifin adı

Statik quraşdırılmış sinifə öz analıq sinifindən deyil, proqramda başqa bir yerdən müraciət etmək istəyirsinizsə, sinifin adını göstərməlisiniz: o, sinifin analıq sinifinin adı və quraşdırılmış sinifin adı ilə formalaşır. Adın ümumi görünüşü belədir:

AnaSinif.QuraşdırılmışSinif

Nümunələr:

Analıq sinif Quraşdırılmış sinif Quraşdırılmış sinifin tam adı
com.javarush.Solution
Point
com.javarush.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 quraşdırılmış sinifdə öz quraşdırılmış sinifi varsa, onların adları sadəcə nöqtə ilə birləşdirilir.

JDK-da quraşdırılmış sinifin tipik nümunəsi — bu Entry sinifi Map sinifinin içindəki sinifdir. Əgər HashMap obyektindən cüt elementlər dəstini almaq istəyirsinizsə, entrySet() metodu sizə Set<Map.Entry> tipindən cüt dəsti qaytaracaq.

Bu Map.Entry yazısı — bu xarici və daxili siniflərdir.

Obyektin yaradılması

Statik quraşdırılmış sinifin obyektini yaratmaq çox asandır. Bu belə görünür:

AnaSinif.QuraşdırılmışSinif ad = new AnaSinif.QuraşdırılmışSinif();

Hamısı adi siniflərdə olduğu kimi, sadəcə ad ikiqatdır.

Statik metodlara müraciət

Əgər statik sinifdə statik metodlar varsa, onlara adi siniflərin statik metodlarına müraciət etdiyiniz kimi müraciət edə bilərsiniz (sadəcə sinifin adı ikiqatdır).

AnaSinif.QuraşdırılmışSinif.statikMetod();

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

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

AnaSinif.QuraşdırılmışSinif.statikDəyişənAdı


3. Statik Siniflərin Xüsusiyyətləri

Statik daxili siniflər ən az statik adlandırıla bilərdi. Onlar adi siniflər kimi davranırlar. Statik olmayan metodlardan onlara müraciətə heç bir məhdudiyyət yoxdur.

Əgər siz analıq sinifin içində daxili statik siniflə işləyirsinizsə, heç bir fərq görməyəcəksiniz, sanki həmin daxili sinif adi bir sinif olsaydı (nə quraşdırılmış, nə də statik).

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 siz hansısa quraşdırılmış statik sinifi onun analıq sinifindən çıxarsanız, yeganə dəyişiklik bu olacaq ki, yeni sinif private static dəyişənlərinə və keçmiş analıq sinifinin 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 səhv olacaq
      points = new ArrayList<Point>();
      points.add(point);
   }
}

Method main adi Point sinifində müraciət edə bilmir private static dəyişən points sinifdə Solution!

Bu, əslində, quraşdırılmış statik sinifin adi sinifdən əsas fərqidir. Quraşdırılmış statik sinifin metodları öz analıq sinifinin bütün statik dəyişənlərinə və metodlarına müraciət edə bilir, hətta onlar private olaraq elan edilsə belə.

Əgər dərindən baxsaq, burada nə təəccüblü var ki? Private modifikatoru xüsusi olaraq bildirir ki, bu modifikator ilə müəyyən edilmiş dəyişənlərə və metodlara yalnız onların sinifinin içərisindən müraciət etmək olar. Daxili statik sinif analıq sinifin içərisindədir? Bəli, onda heç bir problem yoxdur: nə qədər istəyirsiniz müraciət edin.


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