JavaRush /Java Blog /Random-TL /Mga static na nested na klase

Mga static na nested na klase

Nai-publish sa grupo
Kamusta! Patuloy naming ginalugad ang paksa ng mga nested na klase sa Java. Sa huling aralin, napag-usapan natin ang tungkol sa mga non-static na nested na klase o, kung tawagin din sila, mga panloob na klase. Mga static na nested na klase - 2Ngayon ay lumipat tayo sa isa pang grupo at tingnang mabuti ang mga static na nested na klase. Mga static na nested na klase - 3Paano sila naiiba sa ibang mga grupo? Kapag nagdedeklara ng ganoong klase, ginagamit namin ang pamilyar na static na keyword:
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;
       }
   }
}
Mga static na nested na klase - 4Sa halimbawang ito, mayroon kaming isang panlabas na klase Boeing737na lumilikha ng isang eroplano ng modelong ito. At mayroon siyang constructor na may isang parameter: ang taon ng paggawa ( int manufactureYear). Mayroon ding isang static na variable int maxPassengersCount- ang maximum na bilang ng mga pasahero. Magiging pareho ito para sa lahat ng sasakyang panghimpapawid ng parehong modelo, kaya kailangan lang namin ng isang kopya. Bilang karagdagan, mayroon itong static na panloob na klase Drawing- blueprint ng eroplano. Sa klase na ito maaari naming i-encapsulate ang lahat ng impormasyon ng serbisyo tungkol sa sasakyang panghimpapawid. Sa aming halimbawa, para sa pagiging simple, nilimitahan namin ito sa taon ng paggawa, ngunit maaari itong maglaman ng maraming iba pang impormasyon. Mga static na nested na klase - 5Gaya ng tinalakay natin sa huling lecture, ang paggawa ng ganitong nested class ay nagpapataas ng encapsulation at nagpo-promote ng mas makatotohanang abstraction. Ano ang pagkakaiba sa pagitan ng mga static at non-static na nested na klase? 1. Ang isang static na bagay ng klase Drawingay hindi nag-iimbak ng isang reference sa isang partikular na halimbawa ng panlabas na klase. Alalahanin ang halimbawa mula sa huling panayam na may bisikleta:
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!");
       }
   }

}
Doon ay napag-usapan namin kung paano SteeringWheelipinapasa ang isang reference sa isang bagay ng panlabas na klase (bisikleta) sa bawat pagkakataon ng panloob na klase (manibela) nang hindi namin napapansin Bicycle. Kung walang isang bagay ng panlabas na uri, ang isang bagay ng panloob na uri ay hindi maaaring umiral. Hindi ito totoo para sa mga static na nested na klase. Ang isang bagay ng isang static na nested na klase ay madaling umiiral nang mag-isa. Kaugnay nito, ang mga static na klase ay mas "independyente" kaysa sa mga hindi static na klase. Ang tanging punto ay kapag lumilikha ng isang bagay na kailangan mong tukuyin ang pangalan ng panlabas na klase:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Bakit namin ginawang Drawingstatic ang klase, ngunit sa huling lecture ang klase Seat(upuan ng bike) ay hindi static? Tulad ng huling pagkakataon, magdagdag tayo ng kaunting "pilosopiya" upang maunawaan ang halimbawa :) Hindi tulad ng isang upuan ng bisikleta, ang kakanyahan ng pagguhit ay hindi masyadong mahigpit na nakatali sa kakanyahan ng eroplano. Ang isang hiwalay na bagay sa upuan, nang walang bisikleta, ay madalas na walang kabuluhan (bagaman hindi palaging - napag-usapan namin ito sa huling aralin). Ang kakanyahan ng pagguhit ay may katuturan sa sarili nito. Halimbawa, maaaring maging kapaki-pakinabang sa mga inhinyero na nagpaplano ng pag-aayos ng sasakyang panghimpapawid. Hindi nila kailangan ang eroplano mismo para sa pagpaplano, at maaaring matatagpuan kahit saan - isang pagguhit lamang ay sapat na. Bilang karagdagan, para sa lahat ng sasakyang panghimpapawid ng parehong modelo, ang pagguhit ay magiging pareho pa rin, kaya walang ganoong matibay na koneksyon bilang isang upuan na may bisikleta. Samakatuwid, ang bagay Drawingay hindi nangangailangan ng isang link sa isang partikular na bagay ng sasakyang panghimpapawid. 2. Iba't ibang access sa mga variable at pamamaraan ng isang panlabas na klase. Ang isang static na nested class ay makaka-access lamang ng mga static na field ng outer class. Sa aming halimbawa, ang klase Drawingay may isang paraan getMaxPassengersCount()na nagbabalik ng halaga ng isang static na variable maxPassengersCountmula sa isang panlabas na klase. Gayunpaman, hindi kami makakagawa ng paraan getManufactureYear()para Drawingmagbalik ng halaga manufactureYear. Pagkatapos ng lahat, ang isang variable manufactureYearay hindi static, na nangangahulugang dapat itong kabilang sa isang partikular na instance Boeing737. At gaya ng nalaman na natin, sa kaso ng mga static na nested na klase, ang object ng panlabas na klase ay madaling nawawala. Kaya ang limitasyon :) Hindi mahalaga kung anong access modifier ang mayroon ang static na variable sa outer class. Kahit na ito ay private, magkakaroon pa rin ng access mula sa isang static na nested na klase. Ang lahat ng nabanggit sa itaas ay hindi lamang ang pag-access sa mga static na variable, kundi pati na rin sa mga static na pamamaraan. MAHALAGA! Ang salita staticsa isang inner class na deklarasyon ay hindi nangangahulugan na isang bagay lang ang maaaring gawin. Huwag malito ang mga bagay sa mga variable. Kung pinag-uusapan natin ang tungkol sa mga static na variable, oo, isang static na variable ng klase, halimbawa, maxPassangersCountay umiiral sa isang kopya. Ngunit kapag inilapat sa isang nested na klase, staticnangangahulugan lamang ito na ang mga bagay nito ay hindi naglalaman ng mga sanggunian sa mga bagay ng panlabas na klase. At maaari tayong lumikha ng maraming bagay hangga't gusto natin:
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);
           }
       }
   }
}
Idineklara namin ang pamamaraan main()nang direkta sa nested class (walang partikular na dahilan para dito - para lang malaman mo na posible ito), at lumikha ng 5 object Drawing. Sa kabila ng katotohanan na wala kaming isang bagay ng isang panlabas na klase. Tulad ng nakikita mo, walang mga problema :) Console output:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Ito ang nagtatapos sa ating aralin! Kung sakali, mag-iiwan ako sa iyo ng link sa seksyon tungkol sa mga ito sa dokumentasyon ng Oracle . Basahin ito kung mayroong anumang hindi malinaw na mga punto. Ngayon ay oras na upang malutas ang ilang mga problema! :)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION