CodeGym /Java Blog /Random-IT /Classi nidificate statiche
John Squirrels
Livello 41
San Francisco

Classi nidificate statiche

Pubblicato nel gruppo Random-IT
CIAO! Continuiamo ad esplorare l'argomento delle classi nidificate in Java. Nell'ultimo esercizio abbiamo parlato delle classi nidificate non statiche, note anche come classi interne. Classi nidificate statiche - 1Oggi passiamo a un altro gruppo di classi. Considereremo classi nidificate statiche. Classi nidificate statiche - 3In cosa differiscono dalle altre classi? Quando dichiariamo questo tipo di classe, usiamo la parola chiave static, che già conosci:

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;
       }
   }
}
Classi nidificate statiche - 4In questo esempio abbiamo la Boeing737classe esterna, che rappresenta un aeroplano di questo tipo. Ha un costruttore con un parametro: l'anno di produzione ( int manufactureYear). C'è anche una variabile statica: il numero massimo di passeggeri ( int maxPassengersCount). Avrà lo stesso valore per tutti i piani dello stesso modello, quindi abbiamo solo bisogno di un'istanza. Inoltre, ha una classe nidificata statica: Drawing(che rappresenta i progetti ingegneristici dell'aereo). Usiamo questa classe per incapsulare tutte le informazioni ufficiali sull'aeromobile. Nel nostro esempio, per semplicità, abbiamo limitato questa classe all'anno di produzione, ma potrebbe contenere molte altre informazioni. Classi nidificate statiche - 5Come abbiamo detto nell'ultima lezione, la creazione di una tale classe nidificata migliora l'incapsulamento e contribuisce a un'astrazione più realistica. Qual è la differenza tra classi nidificate statiche e non statiche? 1. Un oggetto della Drawingclasse statica non memorizza un riferimento a un'istanza specifica della classe esterna. Ricorda l'esempio della bicicletta dell'ultima lezione:

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

}
In quella lezione abbiamo parlato del fatto che ogni istanza della Handlebarclasse interna, impercettibilmente per noi, passa un riferimento all'istanza della Bicycleclasse esterna. Senza un'istanza della classe esterna, un oggetto della classe interna semplicemente non potrebbe esistere. Per le classi nidificate statiche, questo non è il caso. Un oggetto di una classe nidificata statica è interamente in grado di esistere da solo. A questo proposito, le classi statiche sono più "indipendenti" che non statiche. L'unica cosa che devi sapere è che quando crei un tale oggetto, devi specificare il nome della classe esterna:

public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Perché abbiamo reso la Drawingclasse statica quando nell'ultima lezione abbiamo fatto ilSeatclass (che rappresenta il sedile della bicicletta) non statico? Come l'ultima volta, aggiungiamo un po' di "filosofia" per capire l'esempio :) A differenza di un sedile per bicicletta, il concetto di disegno tecnico non è strettamente legato al concetto di aereo. Senza una bicicletta, un oggetto seggiolino per bicicletta separato sarebbe molto spesso privo di significato (anche se non sempre, ne abbiamo parlato nell'ultima lezione). Il concetto di disegno tecnico ha senso da solo. Ad esempio, potrebbe essere utile agli ingegneri che pianificano la manutenzione degli aerei. L'aereo non è necessario per fare il piano e può essere posizionato ovunque. È necessario solo il disegno tecnico. Inoltre, tutti i velivoli dello stesso modello avranno lo stesso disegno tecnico, quindi non esiste una relazione così stretta come esiste con un seggiolino per bicicletta. Pertanto, ADrawingoggetto non ha bisogno di un riferimento a un oggetto aeroplano specifico. 2. Diverso accesso alle variabili e ai metodi della classe esterna. Una classe nidificata statica può accedere solo ai campi statici di una classe esterna. Nel nostro esempio, la Drawingclasse ha un getMaxPassengersCount()metodo che restituisce il valore della maxPassengersCountvariabile statica della classe esterna. Tuttavia, non possiamo creare un getManufactureYear()metodo nella Drawingclasse per restituire il valore di manufactureYear. Dopotutto, la manufactureYearvariabile non è statica, il che significa che deve appartenere a un'istanza specifica di Boeing737. E come abbiamo già scoperto, nel caso di classi nidificate statiche, l'oggetto della classe esterna può essere facilmente assente. Quindi, la limitazione :) Non importa quale modificatore di accesso abbia una variabile statica nella classe esterna. Anche se lo èprivate, una classe nidificata statica avrà comunque accesso. Tutto quanto sopra si applica non solo all'accesso alle variabili statiche, ma anche ai metodi statici. IMPORTANTE! Nella dichiarazione di una classe interna, la staticparola chiave non significa che puoi creare un solo oggetto. Non confondere gli oggetti con le variabili. Se stiamo parlando di variabili statiche, allora sì, esiste una singola istanza di una variabile di classe statica, ad esempio maxPassangersCount. Ma quando staticviene applicato a una classe nidificata, significa solo che i suoi oggetti non contengono riferimenti a oggetti della classe esterna. E possiamo creare tutti gli oggetti stessi che vogliamo:

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);
           }
       }
   }
}
Abbiamo dichiarato il main()metodo direttamente nella classe nidificata (non c'è un motivo speciale per questo, solo per farti sapere che questo è possibile) e creato 5 Drawingoggetti. Nonostante il fatto che non abbiamo un solo oggetto della classe esterna. Come puoi vedere, questo non ha creato alcun problema :) Output della console:

Drawing{id=1} 
Drawing{id=2} 
Drawing{id=3} 
Drawing{id=4} 
Drawing{id=5}
E questo conclude la nostra lezione! Per ogni evenienza, ti lascio un link alla sezione su di loro nella documentazione di Oracle . Se qualcosa rimane ancora poco chiaro, leggilo. Ora è il momento per me di risolvere un paio di compiti! :)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION