CodeGym/Java blogg/Slumpmässig/Statiska kapslade klasser
John Squirrels
Nivå
San Francisco

Statiska kapslade klasser

Publicerad i gruppen
Hej! Vi fortsätter att utforska ämnet kapslade klasser i Java. I den senaste övningen talade vi om icke-statiska kapslade klasser, som också kallas inre klasser. Statiska kapslade klasser - 1Idag går vi vidare till en annan grupp klasser. Vi kommer att överväga statiska kapslade klasser. Statiska kapslade klasser - 3Hur skiljer de sig från andra klasser? När vi deklarerar den här typen av klass använder vi det statiska nyckelordet, som du redan är bekant med:
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;
       }
   }
}
Statiska kapslade klasser - 4I det här exemplet har vi den Boeing737yttre klassen, som representerar ett flygplan av denna typ. Den har en konstruktör med en parameter: tillverkningsåret ( int manufactureYear). Det finns också en statisk variabel: det maximala antalet passagerare ( ) int maxPassengersCount. Det kommer att ha samma värde för alla plan av samma modell, så vi behöver bara en instans. Dessutom har den en statisk kapslad klass: Drawing(representerar planets tekniska ritningar). Vi använder den här klassen för att kapsla in all officiell information om flygplanet. I vårt exempel har vi för enkelhets skull begränsat den här klassen till tillverkningsåret, men den kan innehålla mycket annan information. Statiska kapslade klasser - 5Som vi sa i förra lektionen, att skapa en sådan kapslad klass förbättrar inkapslingen och bidrar till en mer realistisk abstraktion. Vad är skillnaden mellan statiska och icke-statiska kapslade klasser? 1. Ett objekt i den statiska Drawingklassen lagrar inte en referens till en specifik instans av den yttre klassen. Kom ihåg cykelexemplet från förra lektionen:
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!");
       }
   }

}
I den lektionen talade vi om det faktum att varje instans av den Handlebarinre klassen, omärkligt för oss, skickar en referens till instansen av den Bicycleyttre klassen. Utan en instans av den yttre klassen skulle ett objekt av den inre klassen helt enkelt inte kunna existera. För statiska kapslade klasser är detta inte fallet. Ett objekt av en statisk kapslad klass kan helt existera på egen hand. I detta avseende är statiska klasser mer "oberoende" än icke-statiska. Det enda du behöver veta är att när du skapar ett sådant objekt måste du ange namnet på den yttre klassen:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Varför gjorde vi Drawingklassen statisk när vi gjorde klassen i förra lektionenSeatklass (representerar cykelstolen) icke-statisk? Som förra gången, låt oss lägga till lite "filosofi" för att förstå exemplet :) Till skillnad från en cykelstol är begreppet en ingenjörsritning inte fast knuten till begreppet ett flygplan. Utan en cykel skulle ett separat cykelstolsobjekt oftast vara meningslöst (dock inte alltid, vi pratade om detta i förra lektionen). Konceptet med en ingenjörsritning är vettigt på egen hand. Det kan till exempel vara användbart för ingenjörer som planerar flygplansunderhåll. Flygplanet behövs inte för att göra planen och kan placeras var som helst. Endast ingenjörsritningen behövs. Dessutom kommer alla flygplan av samma modell att ha samma ingenjörsritning, så det finns inget så snävt förhållande som det finns med en cykelstol. Därför, aDrawingobjektet behöver inte en referens till ett specifikt flygplansobjekt. 2. Olika åtkomst till den yttre klassens variabler och metoder. En statisk kapslad klass kan bara komma åt de statiska fälten i en yttre klass. I vårt exempel Drawinghar klassen en getMaxPassengersCount()metod som returnerar värdet på den statiska maxPassengersCountvariabeln för den yttre klassen. Vi kan dock inte skapa en getManufactureYear()metod i Drawingklassen för att returnera värdet på manufactureYear. När allt kommer omkring manufactureYearär variabeln icke-statisk, vilket betyder att den måste tillhöra en specifik instans av Boeing737. Och som vi redan har upptäckt, i fallet med statiska kapslade klasser, kan objektet för den yttre klassen lätt saknas. Därav begränsningen :) Det spelar ingen roll vilken åtkomstmodifierare en statisk variabel har i den yttre klassen. Även om det är detprivate, kommer en statisk kapslad klass fortfarande att ha åtkomst. Allt ovanstående gäller inte bara för tillgång till statiska variabler, utan även för statiska metoder. VIKTIG! I deklarationen av en inre klass staticbetyder nyckelordet inte att du bara kan skapa ett objekt. Blanda inte ihop objekt med variabler. Om vi ​​pratar om statiska variabler, så, ja, det finns en enda instans av en statisk klassvariabel, till exempel maxPassangersCount. Men när staticden tillämpas på en kapslad klass betyder det bara att dess objekt inte innehåller referenser till objekt i den yttre klassen. Och vi kan skapa så många av objekten själva som vi vill:
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);
           }
       }
   }
}
Vi deklarerade main()metoden direkt i den kapslade klassen (det finns ingen speciell anledning till detta - bara för att låta dig veta att detta är möjligt) och skapade 5 Drawingobjekt. Trots att vi inte har ett enda objekt av den yttre klassen. Som du kan se skapade detta inga problem :) Konsolutdata:
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Och det avslutar vår lektion! För säkerhets skull lämnar jag en länk till avsnittet om dem i Oracle-dokumentationen . Om något fortfarande är oklart, läs det. Nu är det dags för mig att lösa ett par uppgifter! :)
Kommentarer
  • Populär
  • Ny
  • Gammal
Du måste vara inloggad för att lämna en kommentar
Den här sidan har inga kommentarer än