"Hi, Amigo!"

"Hi, Ellie!"

"Ngayon mayroon tayong isang napaka-kagiliw-giliw na paksa. Ngayon ay sasabihin ko sa iyo ang tungkol sa mga nested na klase."

"Kung ang isang klase ay idineklara sa loob ng isa pang klase, ito ay isang nested na klase. Ang mga non-static na nested na klase ay tinatawag na mga panloob na klase."

"Ang mga bagay ng isang panloob na klase ay naka-nest sa loob ng mga bagay ng panlabas na klase at samakatuwid ay maaaring ma-access ang mga variable ng panlabas na klase."

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

"Tandaan na ang Door class ay may getDoorHeight method. Ginagamit nito ang variable ng taas ng object ng Car at ibinabalik ang taas ng pinto."

Mga nested na klase - 1

"Ang isang Door object ay hindi maaaring umiral nang hiwalay sa isang Car object. Pagkatapos ng lahat, ito ay gumagamit ng mga variable ng Car object. Ang compiler ay hindi nakikitang nagdaragdag sa constructor at sa Door class ng isang reference sa panlabas na Car object, upang ang mga pamamaraan ng panloob na Door class maaaring ma-access ang mga variable ng panlabas na klase ng Kotse at tawagan ang mga pamamaraan nito."

"Mga nested na bagay. May katuturan sa akin. Sa paghusga sa diagram, lahat ng ito ay diretso."

"And so it is. Except for a couple of nuances."

"May reference ang panloob na Door class sa object ng Kotse, samakatuwid:"

1) Hindi ka makakagawa ng Door object sa loob ng static na paraan ng klase ng Kotse, dahil ang mga static na pamamaraan ay hindi naglalaman ng reference sa object ng Kotse na implicitly na ipinapasa sa Door constructor.

Tama mali
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) Ang Door class ay hindi maaaring maglaman ng mga static na variable o pamamaraan.

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

"At paano kung kailangan ko ng variable na ibinabahagi ng lahat ng bagay sa Door?"

"Maaari mong ideklara ito palagi sa klase ng Kotse. Pagkatapos ay ibabahagi ito ng lahat ng Door objects na naka-nest sa isang Car object."

3) Tandaan: kung ang inner class ay idineklara bilang pampubliko, ang mga instance nito ay maaaring malikha sa labas ng outer class, ngunit ang isang instance ng outer class ay dapat munang umiral:

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

4) At isa pang komento na muntik ko nang makalimutan.

"Dahil mayroon kaming dalawang nested na bagay, ang mga pamamaraan ng panloob na bagay ay may access sa dalawang sanggunian na tinatawag na 'ito':"

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

"Sinadya kong idineklara ang mga variable na may parehong pangalan sa mga klase."

"Upang ma-access ang isang variable mula sa panlabas na klase kapag ito ay nakatago, o upang ma-access ang 'ito' sa loob ng isang panloob na klase, isulat lang ang 'YourClassName.this':"

Paano i-access ang 'ito' ng isang panlabas (o anumang iba pang) klase
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"Kaya, kung isusulat natin 'ito' sa loob ng pamamaraan ng isang panloob na klase, kung gayon ang 'ito' ay tumutukoy sa panloob na klase?"

"Oo eksakto."

"Ano sa tingin mo ang mga panloob na klase, Amigo?"

"Napaka-interesting nila. Hindi ko sasabihin na masyado silang mahirap."

"Maraming mga paghihigpit, ngunit tila lohikal ang mga ito pagkatapos mong ipaliwanag kung saan nanggaling ang mga paghihigpit na iyon at kung bakit umiiral ang mga ito."

"Dagdag pa, dalawang buwan na akong nagsusulat ng mga nested class sa mga gawain, ngunit ngayon ko lang napagtanto kung ano talaga ang sinusulat ko."

"Salamat sa magandang aral, Ellie."

"Natutuwa akong nagustuhan mo ito, Amigo."