CodeGym /Java Blog /Random /Mga static na nested na klase
John Squirrels
Antas
San Francisco

Mga static na nested na klase

Nai-publish sa grupo
Hi! Patuloy naming ginalugad ang paksa ng mga nested na klase sa Java. Sa huling ehersisyo, napag-usapan namin ang tungkol sa mga hindi static na nested na klase, na kilala rin bilang mga panloob na klase Mga static na nested na klase - 1Ngayon ay lumipat kami sa isa pang pangkat ng mga klase. Isasaalang-alang namin ang mga static na nested na klase. Mga static na nested na klase - 3Paano sila naiiba sa ibang mga klase? Kapag nagdedeklara ng ganitong uri ng klase, ginagamit namin ang static na keyword, na pamilyar ka na sa:

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 Boeing737panlabas na klase, na kumakatawan sa isang eroplano ng ganitong uri. Mayroon itong constructor na may isang parameter: ang taon ng paggawa ( int manufactureYear). Mayroon ding isang static na variable: ang maximum na bilang ng mga pasahero ( int maxPassengersCount). Ito ay magkakaroon ng parehong halaga para sa lahat ng mga eroplano ng parehong modelo, kaya kailangan lang namin ng isang halimbawa. Bukod pa rito, mayroon itong static na nested class: Drawing(kumakatawan sa mga engineering blueprint ng eroplano). Ginagamit namin ang klase na ito upang i-encapsulate ang lahat ng opisyal na impormasyon tungkol sa sasakyang panghimpapawid. Sa aming halimbawa, para sa pagiging simple, nilimitahan namin ang klase na ito sa taon ng paggawa, ngunit maaari itong maglaman ng maraming iba pang impormasyon. Mga static na nested na klase - 5Tulad ng sinabi namin sa huling aralin, ang paggawa ng ganoong nested class ay nagpapabuti sa encapsulation at nag-aambag sa isang mas makatotohanang abstraction. Ano ang pagkakaiba sa pagitan ng mga static at non-static na nested na klase? 1. Ang isang object ng static Drawingna klase ay hindi nag-iimbak ng reference sa isang partikular na instance ng panlabas na klase. Alalahanin ang halimbawa ng bisikleta mula sa huling aralin:

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!");
       }
   }

}
Sa araling iyon, pinag-usapan natin ang katotohanan na ang bawat instance ng Handlebarinner class, na hindi mahahalata sa amin, ay nagpapasa ng reference sa instance ng Bicycleouter class. Kung walang isang halimbawa ng panlabas na klase, ang isang bagay ng panloob na klase ay hindi maaaring umiral. Para sa mga static na nested na klase, hindi ito ang kaso. Ang isang bagay ng isang static na nested na klase ay ganap na may kakayahang umiiral nang mag-isa. Sa pagsasaalang-alang na ito, ang mga static na klase ay mas "independyente" kaysa sa hindi static. Ang tanging bagay na kailangan mong malaman ay kapag lumilikha ng naturang bagay, dapat 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 natin ginawang Drawingstatic ang klase gayong sa huling aralin ginawa natin angSeatklase (kumakatawan sa upuan ng bisikleta) hindi static? Tulad ng nakaraang pagkakataon, magdagdag tayo ng kaunting "pilosopiya" upang maunawaan ang halimbawa :) Hindi tulad ng isang upuan ng bisikleta, ang konsepto ng isang pagguhit ng engineering ay hindi mahigpit na nakatali sa konsepto ng isang sasakyang panghimpapawid. Kung walang bisikleta, ang isang hiwalay na bagay sa upuan ng bisikleta ay kadalasang walang kabuluhan (bagaman hindi palaging, napag-usapan namin ito sa huling aralin). Ang konsepto ng isang engineering drawing ay may katuturan sa sarili nitong. Halimbawa, maaari itong maging kapaki-pakinabang sa mga inhinyero na nagpaplano ng pagpapanatili ng eroplano. Ang eroplano ay hindi kailangan para gawin ang plano at maaaring matagpuan kahit saan. Engineering drawing lang ang kailangan. Bilang karagdagan, ang lahat ng sasakyang panghimpapawid ng parehong modelo ay magkakaroon ng parehong pagguhit ng inhinyero, kaya walang ganoong mahigpit na ugnayan tulad ng umiiral sa isang upuan ng bisikleta. Samakatuwid, aDrawingbagay ay hindi nangangailangan ng isang sanggunian sa isang partikular na bagay sa eroplano. 2. Iba't ibang pag-access sa mga variable at pamamaraan ng panlabas na klase. Maa-access lang ng static na nested na klase ang mga static na field ng isang panlabas na klase. Sa aming halimbawa, ang Drawingklase ay may isang getMaxPassengersCount()paraan na nagbabalik ng halaga ng static maxPassengersCountna variable ng panlabas na klase. Gayunpaman, hindi kami makakagawa ng getManufactureYear()paraan sa Drawingklase para ibalik ang halaga ng manufactureYear. Pagkatapos ng lahat, ang manufactureYearvariable ay hindi static, na nangangahulugang dapat itong kabilang sa isang partikular na halimbawa ng Boeing737. At tulad ng natuklasan na natin, sa kaso ng mga static na nested na klase, ang object ng panlabas na klase ay maaaring madaling mawala. Kaya, ang limitasyon :) Hindi mahalaga kung aling access modifier ang mayroon ang isang static na variable sa panlabas na klase. Kahit na ito ayprivate, magkakaroon pa rin ng access ang isang static na nested class. Nalalapat ang lahat ng nasa itaas hindi lamang sa pag-access sa mga static na variable, kundi pati na rin sa mga static na pamamaraan. MAHALAGA! Sa deklarasyon ng isang panloob na klase, ang statickeyword ay hindi nangangahulugan na maaari ka lamang lumikha ng isang bagay. Huwag malito ang mga bagay sa mga variable. Kung pinag-uusapan natin ang tungkol sa mga static na variable, kung gayon, oo, mayroong isang solong halimbawa ng isang static na variable ng klase, halimbawa, maxPassangersCount. Ngunit kapag staticinilapat sa isang nested na klase, nangangahulugan lamang na ang mga bagay nito ay hindi naglalaman ng mga sanggunian sa mga bagay ng panlabas na klase. At maaari tayong lumikha ng marami sa mga bagay sa kanilang sarili 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 main()pamamaraan nang direkta sa nested class (walang espesyal na dahilan para dito — para lang ipaalam sa iyo na posible ito), at gumawa ng 5 Drawingobject. Sa kabila ng katotohanang wala tayong kahit isang bagay ng panlabas na uri. Tulad ng nakikita mo, hindi ito lumikha ng anumang mga problema :) Console output:

Drawing{id=1} 
Drawing{id=2} 
Drawing{id=3} 
Drawing{id=4} 
Drawing{id=5}
At iyon ang nagtatapos sa ating aralin! Kung sakali, mag-iiwan ako sa iyo ng link sa seksyon tungkol sa mga ito sa dokumentasyon ng Oracle . Kung may nananatiling hindi malinaw, basahin ito. Ngayon ay oras na para sa akin upang malutas ang ilang mga gawain! :)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION