Статични вложени класове - 1

„И така, тема номер две са статичните вложени класове. Не забравяйте, че нестатичните вложени класове се наричат ​​вътрешни класове .

„Нека се замислим Howво означава думата статичен в контекста на декларация на вложен клас. Какво мислите?“

"Ако една променлива е декларирана като статична, тогава съществува само едно копие на променливата. Така че, ако вложен клас е статичен, това означава ли, че можете да създадете само един обект от този клас?"

„Не позволявайте думата статичен да ви обърква тук. Вярно е, че ако една променлива е декларирана като статична, тогава има само едно копие на променливата. Но статичният вложен клас е по-скоро като статичен метод в това отношение. думата static преди декларацията на класа показва, че класът не съхранява препратки към обекти от неговия външен клас."

„Ах. Нормалните методи имплицитно съхраняват препратка към обект, но статичните методи не го правят. Същото е и със статичните класове, права ли съм, Ели?“

"Абсолютно. Вашето бързо разбиране е похвално. Статичните вложени класове нямат скрити препратки към обекти от техния външен клас."

class Zoo
{
 private static int count = 7;
 private int mouseCount = 1;

 public static int getAnimalCount()
 {
  return count;
 }

 public int getMouseCount()
 {
  return mouseCount;
 }

 public static class Mouse
 {
  public Mouse()
  {
  }
   public int getTotalCount()
  {
   return count + mouseCount; // Compilation error.
  }
 }
}

„Нека прегледаме внимателно този пример.“

„До Howви променливи може да има достъп статичният метод getAnimalCount?“

„Само статичните. Защото това е статичен метод.“

„До Howви променливи може да има достъп методът getMouseCount?“

„Както статичните, така и нестатичните. Има скрита препратка (това) към обект Zoo.“

„Точно така. И така, статичният вложен клас Mouse, подобно на статичен метод, има достъп до статичните променливи на класа Zoo, но не може да осъществява достъп до нестатичните.“

„Можем безопасно да създаваме обекти Mouse, дори ако не е създаден нито един Zoo обект. Ето How можете да направите това:“

class Home
{
 public static void main(String[] args)
 {
  Zoo.Mouse mouse = new Zoo.Mouse();
 }
}

"Класът Mouse всъщност е много обикновен клас. Фактът, че е деклариран в класа Zoo, му придава две специални характеристики."

1) Когато създавате обекти от вложен клас (като класа Mouse) извън външния клас, трябва също да използвате оператора точка, за да посочите името на външния клас.

"Като това, например: Zoo.Mouse."

2) Класът Zoo.Mouse и неговите обекти имат достъп до частните статични променливи и методи на класа Zoo (тъй като класът Mouse също е деклариран в класа Zoo).

— Това е за днес.

„Значи само едно допълнително име и това е?“

— Да.

— Това е дори по-лесно, отколкото изглеждаше в началото.