CodeGym /Java блог /Случаен /Статични вложени класове
John Squirrels
Ниво
San Francisco

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

Публикувано в групата
здрасти Продължаваме да изследваме темата за вложените класове в Java. В последното упражнение говорихме за нестатични вложени класове, които също са известни като вътрешни класове. Статични вложени класове - 1Днес преминаваме към друга група класове. Ще разгледаме статични вложени класове. Статични вложени класове - 3С Howво се различават от другите класове? Когато декларираме този вид клас, ние използваме ключовата дума static, с която вече сте запознати:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {
      
       public static int getMaxPassengersCount() {
          
           return maxPassengersCount;
       }
   }
}
Статични вложени класове - 4В този пример имаме Boeing737външния клас, който представлява самолет от този тип. Има конструктор с един параметър: годината на производство ( int manufactureYear). Има и една статична променлива: максималният брой пътници ( int maxPassengersCount). Той ще има една и съща стойност за всички равнини от един и същ модел, така че ни трябва само един екземпляр. Освен това има статичен вложен клас: Drawing(представляващ инженерните чертежи на самолета). Използваме този клас, за да капсулираме цялата официална информация за самолета. В нашия пример, за простота, сме ограничor този клас до годината на производство, но той може да съдържа много друга информация. Статични вложени класове - 5Както казахме в миналия урок, създаването на такъв вложен клас подобрява капсулирането и допринася за по-реалистична абстракция. Каква е разликата между статични и нестатични вложени класове? 1. Обект от статичния Drawingклас не съхранява препратка към конкретно копие на външния клас. Спомнете си примера с велосипед от миналия урок:

public class Bicycle {

   private String model;
   private int maxWeight;

   public Bicycle(String model, int maxWeight) {
       this.model = model;
       this.maxWeight = maxWeight;
   }
  
   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
В този урок говорихме за факта, че всеки екземпляр на Handlebarвътрешния клас, неусетно за нас, предава препратка към екземпляра на Bicycleвъншния клас. Без екземпляр от външния клас, обект от вътрешния клас просто не би могъл да съществува. За статичните вложени класове това не е така. Обект от статичен вложен клас е напълно способен да съществува сам. В това отношение статичните класове са по-"независими" от нестатичните. Единственото нещо, което трябва да знаете е, че когато създавате такъв обект, трябва да посочите името на външния клас:

public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Защо направихме Drawingкласа статичен, когато в последния урок направихмеSeatклас (представляващ седалката на велосипеда) нестатичен? Както миналия път, нека добавим малко "философия", за да разберем примера :) За разлика от велосипедната седалка, концепцията за инженерен чертеж не е твърдо обвързана с концепцията за самолет. Без велосипед, отделен обект за велосипедна седалка най-често би бил безсмислен (макар и не винаги, говорихме за това в последния урок). Концепцията за инженерен чертеж има смисъл сама по себе си. Например, може да бъде полезно за инженери, планиращи поддръжка на самолети. Самолетът не е необходим за съставянето на плана и може да бъде разположен навсякъде. Необходим е само инженерният чертеж. В допълнение, всички самолети от един и същи модел ще имат един и същ инженерен чертеж, така че няма толкова тясна връзка, Howвато съществува при седалката за велосипед. Следователно, аDrawingобектът не се нуждае от препратка към конкретен самолетен обект. 2. Различен достъп до променливите и методите на външния клас. Статичен вложен клас има достъп само до статичните полета на външен клас. В нашия пример Drawingкласът има getMaxPassengersCount()метод, който връща стойността на статичната maxPassengersCountпроменлива на външния клас. Не можем обаче да създадем getManufactureYear()метод в Drawingкласа, който да върне стойността на manufactureYear. В крайна сметка manufactureYearпроменливата е нестатична, което означава, че трябва да принадлежи към конкретен екземпляр на Boeing737. И Howто вече открихме, в случай на статични вложени класове, обектът на външния клас може лесно да отсъства. Оттук и ограничението :) Няма meaning кой модификатор за достъп има статичната променлива във външния клас. Дори да е такаprivate, статичен вложен клас все още ще има достъп. Всичко по-горе се отнася не само за достъп до статични променливи, но и за статични методи. ВАЖНО! В декларацията на вътрешен клас staticключовата дума не означава, че можете да създадете само един обект. Не бъркайте обекти с променливи. Ако говорим за статични променливи, тогава, да, съществува единичен екземпляр на статична класова променлива, например, maxPassangersCount. Но когато staticсе прилага към вложен клас, това означава само, че неговите обекти не съдържат препратки към обекти от външния клас. И можем да създадем толкова от самите обекти, колкото пожелаем:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
Декларирахме main()метода директно във вложения клас (няма специална причина за това — само за да ви уведомим, че това е възможно) и създадохме 5 Drawingобекта. Въпреки факта, че нямаме нито един обект от външния клас. Както можете да видите, това не създаде ниHowви проблеми :) Конзолен изход:

Drawing{id=1} 
Drawing{id=2} 
Drawing{id=3} 
Drawing{id=4} 
Drawing{id=5}
И това приключва нашия урок! За всеки случай ще ви оставя връзка към раздела за тях в documentацията на Oracle . Ако все още нещо не е ясно, прочетете го. Сега е време да реша няколко задачи! :)
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION