「こんにちは、アミーゴ!」

「こんにちは、エリー!」

「今日は非常に興味深いトピックがあります。今日はネストされたクラスについてお話します。」

「クラスが別のクラス内で宣言されている場合、それはネストされたクラスです。非静的ネストされたクラスは内部クラスと呼ばれます。」

「内部クラスのオブジェクトは外部クラスのオブジェクト内にネストされているため、外部クラスの変数にアクセスできます。」

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

「Door クラスには getDoorHeight メソッドがあることに注意してください。このメソッドは Car オブジェクトの高さ変数を使用して、ドアの高さを返します。」

ネストされたクラス - 1

「Door オブジェクトは Car オブジェクトから独立して存在することはできません。結局のところ、Door オブジェクトは Car オブジェクトの変数を使用します。コンパイラは、外側の Car オブジェクトへの参照をコンストラクターと Door クラスに目に見えない形で追加します。そのため、内側の Door クラスのメソッドは外側の Car クラスの変数にアクセスし、そのメソッドを呼び出すことができます。」

「入れ子になったオブジェクト。私にとっては理にかなっています。図から判断すると、すべて非常に簡単です。」

「その通りです。いくつかのニュアンスを除いて。」

「内側の Door クラスには Car オブジェクトへの参照があるため、次のようになります。」

1) Car クラスの静的メソッド内に Door オブジェクトを作成することはできません。静的メソッドには、暗黙的に Door コンストラクターに渡される Car オブジェクトへの参照が含まれていないためです。

正しい 正しくない
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 クラスには静的変数または静的メソッドを含めることはできません。

正しい 正しくない
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;
  }
 }
}

「そして、すべての Door オブジェクトで共有される変数が必要な場合はどうすればよいでしょうか?」

「いつでも Car クラスで簡単に宣言できます。そうすれば、Car オブジェクトにネストされているすべての Door オブジェクトで共有されます。」

3) 注:内部クラスが public として宣言されている場合、そのインスタンスは外部クラスの外部に作成できますが、最初に外部クラスのインスタンスが存在する必要があります。

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

4)そして、忘れかけていたコメントがもう 1 つあります。

「入れ子になったオブジェクトが 2 つあるため、内部オブジェクトのメソッドは 'this' と呼ばれる 2 つの参照にアクセスできます。」

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

「クラス内で意図的に同じ名前の変数を宣言しました。」

「非表示の外部クラスから変数にアクセスするか、内部クラス内の 'this' にアクセスするには、単に 'YourClassName.this' と書きます。」

外部 (またはその他の) クラスの「this」にアクセスする方法
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

「では、内部クラスのメソッド内に「this」と書くと、「this」は内部クラスを指すことになるのでしょうか?

"はい、正確に。"

「内なる階級についてどう思いますか、アミーゴ?」

「とても興味深いです。難しすぎるとは言えません。」

「多くの制限がありますが、それらの制限がどこから来て、なぜ存在するのかを説明すると、非常に論理的であるように思えます。」

「さらに、私は 2 か月間、タスク内にネストされたクラスを書き続けてきましたが、今になって初めて、自分が実際に何を書いていたのかを理解しました。」

「素晴らしいレッスンをありがとう、エリー。」

「気に入っていただけてよかったです、アミーゴ」