Statik sinflar

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Ichki sinflar

Yaqinda siz statik o'zgaruvchilar va statik metodlar haqida o'rgandingiz, lekin, ma'lum bo'lishicha, statik sinflar ham bor ekan. Lekin avval boshdan boshlaylik.

Java tilida hech qanday muammo yo'q: sinfni ichida boshqa sinflarni e'lon qilish mumkin. Hatto sinflar ichida sinflar, ular ichida boshqa sinflar ham mumkin. Bu juda oddiy ko'rinadi:

class TashqiClass
{
   klass o'zgaruvchilari
   klass metodlari 
   class IchkiClass
   {
      klass o'zgaruvchilari
      klass metodlari
   }
}

Bir sinfni boshqasining ichida e'lon qilamiz — va hammasi shu.

Misol:

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

Ichki sinflar statik va statik bo'lmagan bo'lishi mumkin. Statik sinflar kiritilgan sinflar (static nested class) deb ham ataladi, statik bo'lmaganlar esa shunchaki ichki sinflar (inner class) deyiladi.



2. Statik sinflar

Statik kiritilgan sinflardan ularning asosiy sinfidan tashqarida ham foydalanish mumkin. Agar bunday sinfda public kirish modifikatori bo'lsa, uni dasturda istalgan joyda ishlatish mumkin. Bunday sinflar aslida oddiy sinflardan farq qilmaydi. Lekin bir nechta farqlar bor.

Sinf nomi

Agar siz statik kiritilgan sinfga uning ota-sinfidan emas, balki dasturda boshqa joydan murojaat qilmoqchi bo'lsangiz, siz sinf nomini ko'rsatishingiz kerak bo'ladi: bu ota-sinf nomi va kiritilgan sinf nomidan iborat. Bu nomning umumiy ko'rinishi quyidagicha:

OtaClass.KiritilganClass

Misollar:

Ota sinf Kiritilgan sinf Kiritilgan sinfning to'liq nomi
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

Agar kiritilgan sinfda o'zining kiritilgan sinfi bo'lsa, ularning ismlari shunchaki nuqta orqali birlashadi.

JDKdagi kiritilgan sinfning tipik misoli — bu Map sinfi ichidagi Entry sinfi. Agar siz HashMap ob'ektidan juftliklar to'plamini olishni xohlasangiz, entrySet() metodi sizga Set<Map.Entry> tipidagi juftliklar to'plamini qaytaradi.

Mana bu Map.Entry yozuvi — bu tashqi va ichki sinflar.

Ob'ekt yaratish

Statik kiritilgan sinf ob'ektini yaratish juda oson. Bu quyidagicha ko'rinadi:

OtaClass.KiritilganClass nom = new OtaClass.KiritilganClass();

Hammasi xuddi oddiy sinflar bilan bir xil, faqat ism ikki marta yoziladi.

Statik metodlarga murojaat qilish

Agar statik sinfda statik metodlar mavjud bo'lsa, ularga murojaat qilish oddiy sinfning statik metodlariga murojaat qilish kabi, faqat endi sinf nomi ikki marta yozilgan.

OtaClass.KiritilganClass.statikMethod();

Statik o'zgaruvchilarga murojaat qilish

Kiritilgan sinfning jamoat statik o'zgaruvchilariga murojaat qilish ham oson:

OtaClass.KiritilganClass.statikO'zgaruvchiIsmi


3. Statik sinflarning xususiyatlari

Statik ichki sinflarni eng kam statik deb atash kerak edi. Ular oddiy sinflar kabi juda o'xshash harakat qiladi. Ularga statik bo'lmagan metodlardan murojaat qilishda hech qanday cheklovlar yo'q.

Agar siz ichki statik sinf bilan uning ota-sinfi ichida ishlaydigan bo'lsangiz, bu ichki sinf oddiy sinf (na kiritilgan, na statik) bo'lganida qanday farq borligini sezmaysiz.

Misol:

Ichki statik sinf Point Oddiy sinf 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;
}

Agar siz qandaydir kiritilgan statik sinfni olib, uni uning ota-sinfindan tashqariga chiqarsangiz, faqatgina yangi sinf private static o'zgaruvchilariga va sobiq ota-sinfning metodlariga murojaat qila olish qobiliyatini yo'qotadi.

Misol:

Ichki statik sinf Point Oddiy sinf 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;

         // ishlaydi
         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;

      // bu yerda xato bo'ladi
      points = new ArrayList<Point>();
      points.add(point);
   }
}

Oddiy Point sinfidagi main metodi murojaat qila olmaydi private static points o'zgaruvchisiga Solution sinfida!

Bu, aslida, asosiy farqi kiritilgan statik sinfdan oddiy sinf. Kiritilgan statik sinfning metodlari ota-sinfining barcha statik o'zgaruvchilari va metodlariga, hatto ular private bo'lsa ham, ega bo'lish imkoniyatiga ega.

Yana ifodalash kerak bo'lsa, unda bunda ajablanarli nima bor? private modifikatori to'g'ridan-to'g'ri o'zgaruvchilar va metodlarga, ushbu modifikator bilan belgilangan, faqat ularning ichki sinfidagi kirish mumkinligini aytadi. Ichki statik sinf ota-sinfning ichida joylashganmi? Ha, unda hech qanday muammo yo'q: qancha xohlasangiz, shuncha murojaat qiling.


Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION