JavaRush /Java блогу /Random-KY /Статикалык уя класстар

Статикалык уя класстар

Группада жарыяланган
Салам! Биз Javaдагы уя класстар темасын изилдөөнү улантып жатабыз. Акыркы сабакта биз статикалык эмес уя класстар же, алар да аталат, ички класстар жөнүндө сүйлөштүк. Статикалык уя класстар - 2Бүгүн башка топко өтүп, статикалык уяланган класстарды жакшыраак карап көрөлү. Статикалык уя класстар - 3Алар башка топтордон эмнеси менен айырмаланат? Мындай классты жарыялоодо биз мурунтан эле тааныш болгон статикалык ачкыч сөздү колдонобуз:
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- учак планы. Бул класста биз учак тууралуу бардык кызматтык маалыматты камтый алабыз. Биздин мисалда, жөнөкөйлүк үчүн, биз аны чыгарылган жылы менен чектедик, бирок ал башка көптөгөн маалыматтарды камтышы мүмкүн. Статикалык уя класстар - 5Акыркы лекцияда талкуулаганыбыздай, мындай уя классты түзүү инкапсуляцияны көбөйтөт жана реалдуураак абстракцияга өбөлгө түзөт. Статикалык жана статикалык эмес уя салынган класстардын ортосунда кандай айырма бар? 1. Статикалык класс an objectи Drawingтышкы класстын белгилүү бир инстанциясына шилтемени сактаbyte. Велосипед менен акыркы лекциядагы мисалды эстеңиз:
public class Bicycle {

   private String model;
   private int mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Go!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

}
SteeringWheelАл жерде биз сырткы класстын an objectисине (велосипедге) шилтеме ички класстын (рулду) ар бир инстанциясына бизге байкабастан кантип берилээри жөнүндө сүйлөштүк Bicycle. Сырткы класстын an objectиси болбосо, ички класстын an objectиси жөн эле жашай алмак эмес. Бул статикалык уя класстар үчүн туура эмес. Статикалык уяланган класстын an objectиси оңой эле өз алдынча жашай алат. Бул жагынан алганда, статикалык класстар статикалык эмес класстарга караганда көбүрөөк "көз карандысыз". Бир гана нерсе, мындай an objectти түзүүдө тышкы класстын атын көрсөтүү керек:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Эмне үчүн классты статикалык кылдык Drawing, бирок акыркы лекцияда класс Seat(велосипед отургуч) статикалык эмес эле? Өткөн жолкудай эле, мисалды түшүнүү үчүн бир аз “философияны” кошолу :) Велосипед отургучтан айырмаланып, чийменин маңызы учактын маңызына мынчалык тыгыз байланышкан эмес. Велосипедсиз өзүнчө отургуч an objectиси көбүнчө маанисиз болуп калат (бирок ар дайым эмес - биз бул тууралуу өткөн сабакта сүйлөшкөнбүз). Чийменин маңызы өзүнөн өзү эле мааниге ээ. Мисалы, учакты оңдоону пландаштырган инженерлер үчүн пайдалуу болушу мүмкүн. Алар пландоо үчүн учактын өзүнө муктаж эмес жана каалаган жерде жайгаштырылышы мүмкүн - бир чийме гана жетиштүү. Мындан тышкары, бир эле үлгүдөгү бардык учактар ​​үчүн чийме мурдагыдай эле болот, ошондуктан велосипед менен отургуч сыяктуу катуу байланыш жок. Демек, an objectке Drawingбелгилүү бир учак an objectисине шилтеме керек эмес. 2. Сырткы класстын өзгөрмөлөрүнө жана ыкмаларына ар кандай мүмкүнчүлүк. Статикалык уя салынган класс тышкы класстын статикалык талааларына гана кире алат. Биздин мисалда класста тышкы класстан статикалык өзгөрмөнүн маанисин кайтарган Drawingметод бар . Бирок, биз маанини кайтаруу үчүн ыкманы түзө албайбыз . Анткени, өзгөрмө статикалык эмес, демек, ал белгилүү бир инстанцияга таандык болушу керек . Ал эми биз буга чейин аныктагандай, статикалык уя класстар учурда, сырткы класстын an objectиси оңой эле жок болушу мүмкүн. Демек, чектөө :) Сырткы класстагы статикалык өзгөрмөнүн кандай мүмкүндүк модификатору бар экендиги маанилүү эмес. Болсо дагы , статикалык уя класстан кирүү мүмкүнчүлүгү болот. Жогоруда айтылгандардын бардыгы статикалык өзгөрмөлөргө гана эмес, статикалык методдорго да тиешелүү. МААНИЛҮҮ! Ички класс декларациясындагы сөз бир эле an object түзүлүшү мүмкүн дегенди билдирбейт. Объекттерди өзгөрмөлөр менен чаташтырбаңыз. Эгерде биз статикалык өзгөрмөлөр жөнүндө сөз кыла турган болсок, ооба, статикалык класс өзгөрмөлөрү, мисалы, бир нускада бар. Бирок уя салынган класска колдонулганда, бул анын an objectилеринде тышкы класстын an objectтерине шилтемелер жок экенин гана билдирет. Жана биз каалагандай көп an objectтерди түзө алабыз: getMaxPassengersCount()maxPassengersCountgetManufactureYear()DrawingmanufactureYearmanufactureYearBoeing737privatestaticmaxPassangersCountstatic
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()түздөн-түз уя салынган класста жарыяладык (бул үчүн эч кандай себеп жок - бул мүмкүн экенин бorшиңиз үчүн) жана 5 an object түздүк Drawing. Бизде тышкы класстын бир дагы an objectи жок экендигине карабастан. Көрүнүп тургандай, эч кандай көйгөйлөр болгон жок :) Консолдун чыгышы:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Ушуну менен биздин сабак аяктайт! Болбосо, мен сизге Oracle documentтериндеги алар жөнүндө бөлүмгө шилтеме калтырам . Эгерде кандайдыр бир түшүнүксүз жагдайлар болсо, аны окуңуз. Эми бир-эки маселени чечүүгө убакыт келди! :)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION