JavaRush /Java блогы /Random-KK /Статикалық кірістірілген сыныптар

Статикалық кірістірілген сыныптар

Топта жарияланған
Сәлеметсіз бе! Біз 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. Статикалық сынып нысаны Drawingсыртқы сыныптың нақты данасына сілтемені сақтамайды. Велосипедпен соңғы лекциядағы мысалды есте сақтаңыз:
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ісі жай ғана өмір сүре алмайды. Бұл статикалық кірістірілген сыныптар үшін дұрыс емес. Статикалық кірістірілген сыныптың нысаны өздігінен оңай өмір сүре алады. Осыған байланысты статикалық сыныптар статикалық емес сыныптарға қарағанда «тәуелсіз». Жалғыз мәселе, мұндай нысанды жасау кезінде сыртқы класстың атын көрсету керек:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Неліктен біз сыныпты Drawingстатикалық еттік, бірақ соңғы дәрісте сынып Seat(велосипед орны) статикалық емес болды? Өткен жолы сияқты, мысалды түсіну үшін кішкене «философия» қосайық :) Велосипед креслосынан айырмашылығы, сызбаның мәні ұшақтың мәніне соншалықты тығыз байланысты емес. Велосипедсіз жеке орындық нысаны көбінесе мағынасыз болады (әрдайым емес - біз бұл туралы өткен сабақта айтқанбыз). Сызбаның мәні өз алдына мағынасы бар. Мысалы, бұл ұшақ жөндеуді жоспарлайтын инженерлерге пайдалы болуы мүмкін. Олар жоспарлау үшін ұшақтың өзін қажет етпейді және кез келген жерде орналасуы мүмкін - тек сызба жеткілікті. Сонымен қатар, бір үлгідегі барлық ұшақтар үшін сызба бұрынғысынша бірдей болады, сондықтан велосипедпен орындық сияқты қатаң байланыс жоқ. Сондықтан нысанға Drawingнақты ұшақ an objectісіне сілтеме қажет емес. 2. Сыртқы класстың айнымалылары мен әдістеріне әртүрлі қол жеткізу. Статикалық кірістірілген сынып тек сыртқы сыныптың статикалық өрістеріне қол жеткізе алады. Біздің мысалда сыныпта сыртқы сыныптан статикалық айнымалының мәнін қайтаратын Drawingәдіс бар . Дегенмен, мәнді қайтару үшін әдісті жасай алмаймыз . Өйткені, айнымалы статикалық емес, яғни ол белгілі бір данаға тиесілі болуы керек . Және біз бұрыннан белгілі болғандай, статикалық кірістірілген сыныптар жағдайында сыртқы сыныптың нысаны оңай жоғалып кетуі мүмкін. Демек, шектеу :) Сыртқы сыныптағы статикалық айнымалының қандай рұқсат модификаторы болғаны маңызды емес. Егер ол болса да , статикалық кірістірілген сыныптан кіру әлі де болады. Жоғарыда айтылғандардың барлығы тек статикалық айнымалыларға ғана емес, сонымен қатар статикалық әдістерге де қатысты. МАҢЫЗДЫ! Ішкі сынып декларациясындағы сөз тек бір нысанды жасауға болады дегенді білдірмейді. Нысандарды айнымалылармен шатастырмаңыз. Егер статикалық айнымалылар туралы айтатын болсақ, иә, статикалық класс айнымалысы, мысалы, бір көшірмеде бар. Бірақ кірістірілген сыныпқа қолданылғанда, бұл оның нысандарында сыртқы сынып нысандарына сілтемелер жоқ екенін ғана білдіреді. Біз қалағанымызша көптеген нысандар жасай аламыз: 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()кірістірілген сыныпта тікелей жарияладық (бұл үшін арнайы себеп жоқ - бұл мүмкін екенін білу үшін) және 5 нысанды жасадық Drawing. Бізде сыртқы класстың бір an objectісі болмағанына қарамастан. Көріп отырғаныңыздай, ешқандай проблемалар болмады :) Консоль шығысы:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Осымен сабағымыз аяқталды! Мүмкін болса, мен сізге Oracle құжаттамасындағы олар туралы бөлімге сілтеме қалдырамын . Түсініксіз жерлер болса оқыңыз. Енді бір-екі мәселені шешудің уақыты келді! :)
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION