Ichki klasslar

All lectures for UZ purposes
Daraja, Dars
Mavjud
Ichki klasslar - 1

— Salom, Amigo!

— Salom, Elli!

— Bugun juda qiziqarli mavzu bo'ladi. Bugun men ichki klasslar haqida gapirib beraman.

Agar bir klassni boshqa klass ichida e'lon qilsak, u holda bunday klass ichki klass deb ataladi.

Ichki klasslarning obyektlari tashqi klasslar obyektlariga joylashtiriladi va tashqi klasslar o'zgaruvchilariga murojaat qilishlari mumkin.

Misol
public class Car
{
 int height = 160;
 ArrayList doors = new ArrayList();

 public Car
 {
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
 } 

class Door()
 {
  public int getDoorHeight()
  {
   return (int)(height * 0.80);
  }
 }
}

Diqqat qil, Door (eshik) klassida getDoorHeight metod bor, u eshikning balandligini qaytaradi va Car obyektining height o'zgaruvchisidan foydalanadi.

Ichki klasslar - 2

Door turidagi obyekt Car turidagi obyekt bilan birga mavjud bo'lolmaydi – axir u uning o'zgaruvchilaridan foydalanadi. Kompilyator sezilmasdan Door klassining konstruktoriga va klassining ichiga Car tashqi klassining obyektiga ishora qo'shadi, shunda Door ichki klassining metodlari tashqi klass Car metodlar va o'zgaruvchilariga murojaat qila oladi.

— Ichki obyektlar. Hammasi tushunarli. Rasmga qaraganda barchasi juda oddiy.

— Shunday. Faqat bir nechta nozik jihatlar bor.

Ichki Door klassida Car obyekti uchun ishora mavjud, shuning uchun:

1) Door obyektini Car klassining statik metodida yaratish mumkin emas: Door turidagi konstruktoriga noaniq tarzda uzatiladigan Car turidagi obyektni olishning imkoniyati yo'q.

To'g'ri Noto'g'ri
public class Car
{
 public static Door createDoor()
 {
 Car car = new Car();
  return car.new Door();
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{
 public static Door createDoor()
 {
  return new Door();
 }

 public class Door
 {
  int width, height;
 }
}

2) Door klassi statik o'zgaruvchilar va metodlarni o'z ichiga olmaydi.

To'g'ri Noto'g'ri
public class Car
{
 public int count;
 public int getCount()
 {
  return count;
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{

 public class Door
 {
  public static int count;
  int width, height;

  public static int getCount()
  {
   return count;
  }
 }
}

— Agar menga barcha Door obyektlari uchun umumiy o'zgaruvchi kerak bo'lsa-chi?

Sen har doim uni Car klassida e'lon qilishing mumkin – bu Car obyektiga joylashtirilgan barcha Door obyektlari uchun umumiy o'zgaruvchi bo'ladi.

3) E'tibor bering, agar ichki klass public deb e'lon qilingan bo'lsa, uning obyektlari tashqi klassdan tashqarida yaratilishi mumkin, lekin tashqi klass obyekti mavjud bo'lishi shart:

Car car = new Car();
Car.Door door = car.new Door();
Car.Door door = new Car().new Door();

4) Va yana bir eslatma – deyarli unutib qoldim.

Chunki bizda ikki ichki obyekt bor, ichki obyektning metodlarida this uchun ikkita qoʻlga kiritish mavjud:

public class Car
{
 int width, height;

 public class Door
 {
  int width, height;

  public void setHeight(int height)
  {
   this.height = height;
  } 

  public int getHeight()
  {
   if (height!=0)
    return this.height;
   else 
    return (int)(Car.this.height * 0.8);
  }
 }
}

Men maxsus holatda ikki klassda bir xil nomli o'zgaruvchilarni e'lon qildim.

Tashqi klassning o'zgaruvchisiga murojaat qilish uchun, u yashiringanida yoki tashqi klassning this o'zgaruvchisiga murojaat qilish uchun, shunchaki "klass nomi" nuqta this ni yozish kifoya:

Tashqi (yoki har qanday) klassning this ga qanday kirish mumkin
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

— Agarda biz ichki klass metodida this yozsa, bu this ichki klassga tegishli bo'ladi?

— Ha. Aynan shunday.

Ichki klasslar haqida nima deysan, Amigo?

— Juda qiziq. Men unchalik qiyin deb aytmagan bo'lardim.

Ko'p cheklovlar bor, lekin ular juda mantiqiy, sen menga ularga asos bo'lgan narsalarni tushuntirganingda, hammasi tushunarli bo'ldi.

Men ikki oydan beri amaliyotda uzluksiz ichki klasslar yozaman va endi nimani aynan yozayotganimni tushunib oldim.

Ajoyib dars uchun rahmat, Elli.

— Sen yoqtirgandan xursandman, Amigo.

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