CodeGym/Blog Java/Aleatoriu/Clase imbricate statice
John Squirrels
Nivel
San Francisco

Clase imbricate statice

Publicat în grup
Bună! Continuăm să explorăm subiectul claselor imbricate în Java. În ultimul exercițiu, am vorbit despre clasele imbricate non-statice, care sunt cunoscute și sub numele de clase interioare. Clase imbricate statice - 1Astăzi trecem la un alt grup de clase. Vom lua în considerare clasele imbricate statice. Clase imbricate statice - 3Prin ce sunt diferite de celelalte clase? Când declarăm acest tip de clasă, folosim cuvântul cheie static, cu care ești deja familiarizat:
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;
       }
   }
}
Clase imbricate statice - 4În acest exemplu, avem Boeing737clasa exterioară, care reprezintă un avion de acest tip. Are un constructor cu un singur parametru: anul de fabricație ( int manufactureYear). Există și o variabilă statică: numărul maxim de pasageri ( int maxPassengersCount). Va avea aceeași valoare pentru toate planurile aceluiași model, așa că avem nevoie de o singură instanță. În plus, are o clasă imbricată statică: Drawing(reprezentând planurile de inginerie ale avionului). Folosim această clasă pentru a cuprinde toate informațiile oficiale despre aeronavă. În exemplul nostru, pentru simplitate, am limitat această clasă la anul de fabricație, dar ar putea conține multe alte informații. Clase imbricate statice - 5După cum am spus în ultima lecție, crearea unei astfel de clase imbricate îmbunătățește încapsularea și contribuie la o abstractizare mai realistă. Care este diferența dintre clasele imbricate statice și non-statice? 1. Un obiect al clasei statice Drawingnu stochează o referință la o anumită instanță a clasei exterioare. Amintiți-vă de exemplul de bicicletă din ultima lecție:
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!");
       }
   }

}
În acea lecție, am vorbit despre faptul că fiecare instanță a Handlebarclasei interioare, imperceptibil pentru noi, trece o referință la instanța clasei exterioare Bicycle. Fără o instanță a clasei exterioare, un obiect al clasei interioare pur și simplu nu ar putea exista. Pentru clasele imbricate statice, acesta nu este cazul. Un obiect al unei clase imbricate statice este complet capabil să existe singur. În acest sens, clasele statice sunt mai „independente” decât non-statice. Singurul lucru pe care trebuie să-l știți este că atunci când creați un astfel de obiect, trebuie să specificați numele clasei exterioare:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
De ce am făcut Drawingclasa statică când în ultima lecție am făcut-oSeatclasa (reprezentând scaunul bicicletei) non-static? Ca și data trecută, să adăugăm puțină „filozofie” pentru a înțelege exemplul :) Spre deosebire de un scaun de bicicletă, conceptul de desen ingineresc nu este legat rigid de conceptul de avion. Fără o bicicletă, un obiect separat de scaun pentru bicicletă ar fi cel mai adesea lipsit de sens (deși nu întotdeauna, am vorbit despre asta în ultima lecție). Conceptul de desen ingineresc are sens de la sine. De exemplu, ar putea fi util inginerilor care planifică întreținerea avioanelor. Avionul nu este necesar pentru a face planul și poate fi localizat oriunde. Este nevoie doar de desenul tehnic. În plus, toate aeronavele cu același model vor avea același desen de inginer, așa că nu există o relație atât de strânsă precum cea a unui scaun de bicicletă. Prin urmare, aDrawingobiectul nu are nevoie de o referire la un anumit obiect de avion. 2. Acces diferit la variabilele și metodele clasei exterioare. O clasă imbricată statică poate accesa numai câmpurile statice ale unei clase exterioare. În exemplul nostru, Drawingclasa are o getMaxPassengersCount()metodă care returnează valoarea maxPassengersCountvariabilei statice a clasei exterioare. Cu toate acestea, nu putem crea o getManufactureYear()metodă în Drawingclasă pentru a returna valoarea manufactureYear. La urma urmei, manufactureYearvariabila este non-statică, ceea ce înseamnă că trebuie să aparțină unei anumite instanțe de Boeing737. Și așa cum am descoperit deja, în cazul claselor imbricate statice, obiectul clasei exterioare poate lipsi cu ușurință. Prin urmare, limitarea :) Nu contează ce modificator de acces are o variabilă statică în clasa exterioară. Chiar dacă esteprivate, o clasă imbricată statică va avea în continuare acces. Toate cele de mai sus se aplică nu numai accesului la variabile statice, ci și metodelor statice. IMPORTANT! În declarația unei clase interioare, staticcuvântul cheie nu înseamnă că puteți crea un singur obiect. Nu confunda obiectele cu variabilele. Dacă vorbim despre variabile statice, atunci, da, există o singură instanță a unei variabile de clasă statică, de exemplu, maxPassangersCount. Dar atunci când staticeste aplicat unei clase imbricate, înseamnă doar că obiectele sale nu conțin referințe la obiecte din clasa exterioară. Și putem crea câte obiecte ne dorim:
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);
           }
       }
   }
}
Am declarat main()metoda direct în clasa imbricată (nu există un motiv special pentru aceasta - doar pentru a vă anunța că acest lucru este posibil) și am creat 5 Drawingobiecte. În ciuda faptului că nu avem un singur obiect din clasa exterioară. După cum puteți vedea, acest lucru nu a creat probleme :) Ieșirea consolei:
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Și asta încheie lecția noastră! Pentru orice eventualitate, vă las un link către secțiunea despre ele din documentația Oracle . Dacă ceva rămâne neclar, citiți-l. Acum este timpul să rezolv câteva sarcini! :)
Comentarii
  • Popular
  • Nou
  • Vechi
Trebuie să fii conectat pentru a lăsa un comentariu
Această pagină nu are încă niciun comentariu