JavaRush /Java Blog /Random-IT /Classi nidificate statiche

Classi nidificate statiche

Pubblicato nel gruppo Random-IT
Ciao! Continuiamo ad esplorare l'argomento delle classi nidificate in Java. Nell'ultima lezione abbiamo parlato delle classi nidificate non statiche o, come vengono anche chiamate, classi interne. Classi nidificate statiche - 2Oggi passiamo a un altro gruppo e diamo uno sguardo più da vicino alle classi nidificate statiche. Classi nidificate statiche - 3In cosa differiscono dagli altri gruppi? Quando dichiariamo una classe di questo tipo, utilizziamo la già familiare parola chiave statica:
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 una classe esterna Boeing737che crea un aereo di questo modello. E ha un costruttore con un parametro: l'anno di produzione ( int manufactureYear). C'è anche una variabile statica int maxPassengersCount: il numero massimo di passeggeri. Sarà lo stesso per tutti gli aerei dello stesso modello, quindi ci servirà solo una copia. Inoltre, ha una classe interna statica Drawing: il progetto dell'aereo. In questa classe possiamo incapsulare tutte le informazioni di servizio sull'aeromobile. Nel nostro esempio, per semplicità, lo abbiamo limitato all'anno di produzione, ma può contenere molte altre informazioni. Classi nidificate statiche - 5Come abbiamo discusso nell'ultima lezione, la creazione di una classe nidificata di questo tipo aumenta l'incapsulamento e promuove un'astrazione più realistica. Qual è la differenza tra classi nidificate statiche e non statiche? 1. Un oggetto di classe statica Drawingnon memorizza un riferimento a un'istanza specifica della classe esterna. Ricorda l'esempio dell'ultima lezione con una bicicletta:
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!");
       }
   }

}
Lì abbiamo parlato di come SteeringWheelun riferimento a un oggetto della classe esterna (bicicletta) viene passato in ogni istanza della classe interna (volante) senza che ce ne accorgiamo Bicycle. Senza un oggetto della classe esterna, un oggetto della classe interna semplicemente non potrebbe esistere. Questo non è vero per le classi nidificate statiche. Un oggetto di una classe nidificata statica può facilmente esistere da solo. A questo proposito, le classi statiche sono più “indipendenti” rispetto alle classi non statiche. L'unico punto è che quando si crea un oggetto del genere è necessario 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 lezione Drawingstatica, ma nell'ultima lezione la classe Seat(seggiolino per bicicletta) era non statica? Come l'ultima volta, aggiungiamo un po' di "filosofia" per comprendere l'esempio :) A differenza del sedile di una bicicletta, l'essenza del disegno non è così strettamente legata all'essenza dell'aereo. Un oggetto sedile separato, senza bicicletta, molto spesso non avrà senso (anche se non sempre - ne abbiamo parlato nell'ultima lezione). L'essenza del disegno ha senso in sé. Ad esempio, può essere utile agli ingegneri che pianificano le riparazioni degli aerei. Non hanno bisogno dell'aereo stesso per la pianificazione e possono essere posizionati ovunque: basta solo un disegno. Inoltre, per tutti gli aerei dello stesso modello, il disegno sarà sempre lo stesso, quindi non esiste una connessione così rigida come un sedile con una bicicletta. Pertanto, l'oggetto Drawingnon necessita di un collegamento a un oggetto aereo specifico. 2. Accesso diverso a variabili e metodi di una classe esterna. Una classe nidificata statica può accedere solo ai campi statici della classe esterna. Nel nostro esempio, la classe Drawingha un metodo getMaxPassengersCount()che restituisce il valore di una variabile statica maxPassengersCountda una classe esterna. Tuttavia, non possiamo creare un metodo getManufactureYear()per Drawingrestituire un valore manufactureYear. Dopotutto, una variabile manufactureYearnon è statica, il che significa che deve appartenere a un'istanza specifica Boeing737. E come abbiamo già scoperto, nel caso di classi nidificate statiche, l'oggetto della classe esterna può facilmente mancare. Da qui la limitazione :) Non importa quale modificatore di accesso abbia la variabile statica nella classe esterna. Anche se lo è private, ci sarà comunque accesso da una classe nidificata statica. Tutto quanto sopra riguarda non solo l'accesso alle variabili statiche, ma anche ai metodi statici. IMPORTANTE! La parola staticin una dichiarazione di classe interna non significa che è possibile creare un solo oggetto. Non confondere gli oggetti con le variabili. Se parliamo di variabili statiche, sì, una variabile di classe statica, ad esempio, maxPassangersCountesiste in un'unica copia. Ma quando applicato a una classe nidificata, staticsignifica solo che i suoi oggetti non contengono riferimenti a oggetti della classe esterna. E possiamo creare quanti oggetti 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 metodo main()direttamente nella classe nidificata (non c'è una ragione particolare per questo, solo per farti sapere che è possibile) e creato 5 oggetti Drawing. Nonostante non abbiamo un singolo oggetto di una classe esterna. Come puoi vedere, non ci sono stati problemi :) Output della console:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Questo conclude la nostra lezione! Per ogni evenienza, ti lascerò un collegamento alla sezione che li riguarda nella documentazione di Oracle . Leggilo se ci sono punti poco chiari. Ora è il momento di risolvere un paio di problemi! :)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION