JavaRush /Java Blog /Random-TK /Java-da içerki synplar ýa-da Içerki synp

Java-da içerki synplar ýa-da Içerki synp

Toparda çap edildi
Salam! Bu gün möhüm bir mowzuga - Java-da ýerleşdirilen sapaklaryň nähili işlejekdigine seredip başlarys. Iňlis dilinde olara höwürtge synplary diýilýär. Java başgalaryň içinde käbir synplary döretmäge mümkinçilik berýär:
class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
    class InnerClass {
        ...
    }
}
Hut şu synplara höwürtge diýilýär. Olar 2 görnüşe bölünýärler:
  1. Statik däl höwürtge synplary - statik däl höwürtge synplary. Olara başga bir görnüşde içki synplar hem diýilýär.
  2. Statik höwürtge synplary - statiki höwürtge synplary.
Öz gezeginde içerki synplarda iki sany ýörite görnüş bar. Içki synpyň diňe içki synp bolup biljekdiginden başga-da:
  • ýerli synp
  • anonim synp
Biraz kynmy? :) Bolýar, düşnükli bolmak üçin diagramma. Birden aljyraňňy duýsaňyz, leksiýa wagtynda oňa gaýdyp geliň! Içerki içerki synplar - 2Şu günki leksiýamyzda içerki synplar - içerki synplar (olar hem statik däl höwürtge synplary, statik däl höwürtge synplary) hakda gürleşeris. Lostitirilmezlik üçin umumy diagrammada aýratyn görkezilýär :) Geliň, aç-açan sorag bilen başlalyň: näme üçin bu synplara “içerki” diýilýär? Jogap gaty ýönekeý: sebäbi olar beýleki synplaryň içinde döredilýär. Ine bir mysal:
public class Bicycle {

   private String model;
   private int weight;

   public Bicycle(String model, int weight) {
       this.model = model;
       this.weight = weight;
   }

   public void start() {
       System.out.println("Go!");
   }

   public class HandleBar {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

   public class Seat {

       public void up() {

           System.out.println("The seat is up!");
       }

       public void down() {

           System.out.println("The seat is down!");
       }
   }
}
Bu ýerde synpymyz bar Bicycle- welosiped. Onda 2 meýdan we 1 usul bar - start(). Içerki içerki synplar - 3Adaty synpdan tapawudy, iki klasy bar, kody içerde ýazylýar Bicycle- bular synplar HandleBar(rul) we Seat(oturgyç). Bular doly hukukly synplar: görşüňiz ýaly, olaryň hersiniň öz usullary bar. Şu wagt bir soragyňyz bolup biler: näme üçin bir synpy beýlekisine goýduk? Näme üçin olary içerki edýär? Bolýar, programmada rul we oturgyç üçin aýratyn synplar gerek diýeliň. Emma olary höwürtgelemek hökman däl! Siz yzygiderli sapaklar edip bilersiňiz. Mysal üçin, şuňa meňzeş:
public class HandleBar {
   public void right() {
       System.out.println("Steering wheel to the right!");
   }

   public void left() {

       System.out.println("Steering wheel left");
   }
}

public class Seat {

   public void up() {

       System.out.println("The seat is up!");
   }

   public void down() {

       System.out.println("The seat is down!");
   }
}
Gaty gowy sorag! Elbetde, tehniki çäklendirmelerimiz ýok - muny şeýle edip bileris. Bu, belli bir programmanyň nukdaýnazaryndan we şol programmanyň manysynda sapaklary dogry düzmek hakda. Içerki synplar, başga bir gurama bilen aýrylmaz baglanyşykly programmada belli bir guramany görkezmek üçin sapaklardyr. Rul, oturgyç, pedallar welosipediň düzüm bölekleridir. Welosipedden aýrylanlaryň manysy ýok. Bu synplaryň hemmesini jemgyýetçilik sapaklaryny aýratyn eden bolsak, programmamyzda, mysal üçin, aşakdaky kod bolup biler:
public class Main {

   public static void main(String[] args) {
       HandleBar handleBar = new HandleBar();
       handleBar.right();
   }
}
Ummm ... Bu koduň manysyny düşündirmek hem kyn. Bizde geň welosiped tutawajy bar (näme üçin gerek? Pikir ýok, dogrymy aýtsam). Bu rul bolsa nämüçindir saga ... özbaşdak, welosipedsiz ... öwrülýär. Ruluň düýp manysyny welosipediň mazmunyndan aýyrmak bilen, programmamyzyň logikasyny ýitirdik. Içerki synpy ulanyp, kod düýbünden başgaça görünýär:
public class Main {

   public static void main(String[] args) {

       Bicycle peugeot = new Bicycle("Peugeot", 120);
       Bicycle.HandleBar handleBar = peugeot.new HandleBar();
       Bicycle.Seat seat = peugeot.new Seat();

       seat.up();
       peugeot.start();
       handleBar.left();
       handleBar.right();
   }
}
Konsol çykyşy:

Сиденье поднято выше!
Поехали!
Руль влево!
Руль вправо!
Bolýan zatlar birden many berdi! :) Tigir obýektini döretdik. Biz onuň “subýektlerinden” ikisini - rul we oturgyç döretdik. Amatlylygy üçin oturgyjy has ýokary galdyrdyk - gitdik: gitmeli ýerimizi sürýäris we dolandyrýarys! :) Gerekli usullar zerur zatlara çagyrylýar. Hemme zat ýönekeý we amatly. Bu mysalda, tutawaç panellerini we oturgyjyny görkezmek, encapsulýasiýany güýçlendirýär (welosipediň degişli bölümiň bölekleri barada maglumatlary gizleýäris) we has jikme-jik abstraksiýa döretmäge mümkinçilik berýär. Indi başga bir ýagdaýa seredeliň. Welosiped we bölekler dükanyny modelleşdirýän programma döretmek isleýäris diýeliň. Içerki içerki synplar - 4Bu ýagdaýda öňki çözgütimiz başa barmaz. Bölekler dükanynyň çäginde welosipediň her bir bölegi welosipediň düýp manysyndan başga-da many berýär. Mysal üçin, “pedaly alyja satmak”, “täze oturgyç satyn almak” we ş.m. ýaly usullar gerek bolar. Bu ýerde içerki sapaklary ulanmak ýalňyşlyk bolar - täze programmamyzdaky welosipediň her bir böleginiň öz manysy bar: welosipediň düýp manysyndan aýry we hiç hili baglanyşygy ýok. Içki synplary ulanmalydygyňyzy ýa-da ähli guramalary aýratyn synplara bölmelidigiňiz hakda pikir edýän bolsaňyz, üns bermeli zadyňyz şu. Obýekte gönükdirilen programmirlemek ajaýyp, sebäbi hakyky dünýädäki subýektleri modelleşdirmegi aňsatlaşdyrýar. Içki synplary ulanmalydygyňyzy kesgitläniňizde gollanma hökmünde ulanyp boljak zadyňyz şu. Hakyky dükanda bölekler tigirlerden aýry - bu adaty zat. Bu, programma düzülende munuň dogry boljakdygyny aňladýar. Bolýar, biz “pelsepe” kesgitledik :) Indi içerki synplaryň möhüm “tehniki” aýratynlyklary bilen tanyşalyň. Ine, hökman ýatda saklamaly we düşünmeli zatlaryňyz:
  1. Içki synpyň obýekti “daşarky” synpyň obýekti bolmazdan bolup bilmez.

    Bu mantykly: şonuň üçin eýeçiliksiz rullar we oturgyçlar programmamyzda bu ýerde görünmezligi üçin Seatiçerki synplar etdik .HandleBar

    Bu kod düzülmez:

    public static void main(String[] args) {
    
       HandleBar handleBar = new HandleBar();
    }

    Aşakdaky möhüm aýratynlyk:

  2. Içerki synpyň obýekti "daşarky" synpyň üýtgeýänlerine girip biler.

    Mysal üçin, synpymyza Bicycleüýtgeýji goşalyň int seatPostDiameter- oturgyç ýeriniň diametri.

    Soňra içerki synpda bize oturgyç parametrini aýdyp biljek Seatusul döredip bileris :getSeatParam()

    public class Bicycle {
    
       private String model;
       private int weight;
    
       private int seatPostDiameter;
    
       public Bicycle(String model, int weight, int seatPostDiameter) {
           this.model = model;
           this.weight = weight;
           this.seatPostDiameter = seatPostDiameter;
    
       }
    
       public void start() {
           System.out.println("Go!");
       }
    
       public class Seat {
    
           public void up() {
    
               System.out.println("The seat is up!");
           }
    
           public void down() {
    
               System.out.println("The seat is down!");
           }
    
           public void getSeatParam() {
    
               System.out.println("Seat parameter: seatpost diameter = " + Bicycle.this.seatPostDiameter);
           }
       }
    }

    Indi bu maglumatlary programmamyzda alyp bileris:

    public class Main {
    
       public static void main(String[] args) {
    
           Bicycle bicycle = new Bicycle("Peugeot", 120, 40);
           Bicycle.Seat seat = bicycle.new Seat();
    
           seat.getSeatParam();
       }
    }

    Konsol çykyşy:

    
    Параметр сиденья: диаметр подседельного штыря = 40

    Üns beriň:täze üýtgeýji iň berk üýtgediji bilen yglan edildi - private. Şeýle-de bolsa, içki synpyň ygtyýary bar!

  3. Içki synp obýekti "daşarky" synpyň statiki usulynda döredilip bilinmez.

    Bu içerki synplaryň dizaýn aýratynlyklary bilen düşündirilýär. Içerki synpda parametrleri bolan ýa-da diňe deslapky konstruktor bolup biler. Thisöne muňa garamazdan, içerki synpyň obýektini döredenimizde, “daşarky” synpyň obýektine salgylanma ýuwaşlyk bilen geçýär. Galyberse-de, şeýle obýektiň bolmagy hökmany şertdir. Otherwiseogsam içerki synpyň obýektlerini döredip bilmeris.

    Emma daşarky synp usuly statik bolsa, daşarky synp obýekti düýbünden ýok bolup biler! Bu, içki synpyň logikasynyň bozuljakdygyny aňladýar. Şeýle ýagdaýda düzüji ýalňyşlyk goýberer:

    public static Seat createSeat() {
    
       //Bicycle.this cannot be referenced from a static context
       return new Seat();
    }
  4. Içerki synpda statiki üýtgeýjiler we usullar bolup bilmez.

    Bu ýerdäki logika birmeňzeş: statiki usullar we üýtgeýjiler bar bolup biler we obýekt bolmasa-da çagyrylyp bilner.

    Emma “daşarky” synpyň obýekti bolmasa, içki synpa girip bilmeris.

    Görnükli gapma-garşylyk! Şonuň üçin içerki synplarda statiki üýtgeýänleriň we usullaryň bolmagy gadagandyr.

    Düzediji olary döretjek bolanda ýalňyşlyk goýberer:

    public class Bicycle {
    
       private int weight;
    
    
       public class Seat {
    
           //inner class cannot have static declarations
           public static void getSeatParam() {
    
               System.out.println("Seat parameter: seatpost diameter = " + Bicycle.this.seatPostDiameter);
           }
       }
    }
  5. Içerki synpyň obýekti döredilende, onuň giriş üýtgedijisi möhüm rol oýnaýar.

    Içerki synpy adaty giriş üýtgedijileri - public, we .privateprotectedpackage private

    Näme üçin bu möhüm?

    Bu, programmamyzdaky içki synpy derrew nirä alyp biljekdigimize täsir edýär.

    Biziň synpymyz Seatyglan edilse public, obýektlerini başga synpda döredip bileris. Onlyeke-täk talap, “daşarky” synpyň obýekti hem bolmalydyr.

    Theeri gelende aýtsak, muny eýýäm şu ýerde etdik:

    public class Main {
    
       public static void main(String[] args) {
    
           Bicycle peugeot = new Bicycle("Peugeot", 120);
           Bicycle.HandleBar handleBar = peugeot.new HandleBar();
           Bicycle.Seat seat = peugeot.new Seat();
    
           seat.up();
           peugeot.start();
           handleBar.left();
           handleBar.right();
       }
    }

    HandleBarIçerki synpa aňsatlyk bilen girdik Main.

    Içki synpy yglan etsek private, diňe “daşarky” synpyň içinde obýektler döretmäge mümkinçilik alarys.

    Indi daşardan bir zat döredip Seatbilmeris :

    private class Seat {
    
       //methods
    }
    
    public class Main {
    
       public static void main(String[] args) {
    
           Bicycle bicycle = new Bicycle("Peugeot", 120, 40);
    
           //Bicycle.Seat has a private access in 'Bicycle'
           Bicycle.Seat seat = bicycle.new Seat();
       }
    }

    Mantyka eýýäm düşünen bolsaňyz gerek :)

  6. Içerki synplar üçin giriş üýtgedijileri adaty üýtgeýänler ýaly işleýär.

    Üýtgediji, protectednesil synplarynda we şol bir paketdäki synplarda synp üýtgeýjisine girişi üpjün edýär.

    protectedIçki synplar üçin hem edil şonuň ýaly . protectedIçerki synp obýektleri döredilip bilner:

    • "daşarky" synpyň içinde;
    • nesil synplarynda;
    • şol bir paketdäki şol synplarda.

    Içki synpda giriş üýtgediji () ýok bolsa package private, içki synpyň obýektleri döredilip bilner

    • "daşarky" synpyň içinde;
    • şol bir paketdäki sapaklarda.

    Modifikatorlar bilen köpden bäri tanyş, şonuň üçin bu ýerde hiç hili problema bolmaz.

Bularyň hemmesi häzirlikçe :) relaxöne dynç alma! Içerki içerki sapaklar, geljekki sapaklarda öwrenmegi dowam etdireris. Indi kursumyzdan içerki synplar baradaky leksiýany öwrenip bilersiňiz . Indiki gezek bolsa statiki höwürtgelenen synplar hakda gürleşeris.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION