JavaRush /Блоги Java /Random-TG /Синфҳои дохилӣ ё Синфи дохилӣ дар Java

Синфҳои дохилӣ ё Синфи дохилӣ дар Java

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо ба баррасии як мавзӯи муҳим шурӯъ мекунем - чӣ гуна синфҳои лона дар Java кор мекунанд. Дар забони англисӣ онҳо синфҳои лона номида мешаванд. Java ба шумо имкон медиҳад, ки баъзе синфҳоро дар дохor дигарон эҷод кунед:
class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
    class InnerClass {
        ...
    }
}
Маҳз ин синфҳо лона номида мешаванд. Онҳо ба 2 намуд тақсим мешаванд:
  1. Синфҳои лонаҳои ғайристатикӣ - синфҳои лонаҳои ғайристатикӣ. Онҳоро ба таври дигар синфҳои дохилӣ низ меноманд.
  2. Синфҳои лонаҳои статикӣ - синфҳои лонаҳои статикӣ.
Дар навбати худ, синфҳои дохилӣ ду зергурӯҳи махсус доранд. Ғайр аз он, ки синфи дохилӣ метавонад танҳо як синфи дохилӣ бошад, он инчунин метавонад:
  • синфи маҳаллӣ
  • синфи беном
Каме мушкил? :) Ин хуб аст, дар ин ҷо диаграмма барои равшанӣ аст. Ҳангоми лексия, агар шумо ногаҳон ошуфта бошед, ба он баргардед! Синфҳои дохилӣ - 2Дар лексияи имрӯза мо дар бораи синфҳои дохилӣ гап мезанем - синфҳои дохилӣ (онҳо инчунин синфҳои даруннашудаи статикӣ, синфҳои лонаҳои ғайристатикӣ мебошанд). Онҳо дар диаграммаи умумӣ махсус қайд карда шудаанд, то шумо гум нашавед :) Биёед аз саволи равшан оғоз кунем: чаро ин синфҳоро "дохилӣ" меноманд? Ҷавоб хеле оддӣ аст: зеро онҳо дар дохor синфҳои дигар сохта шудаанд. Инак як мисол:
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!");
       }
   }
}
Дар ин ҷо мо синф дорем Bicycle- велосипед. Он дорои 2 майдон ва 1 усул - start(). Синфҳои дохилӣ - 3Фарқи он аз синфи муқаррарӣ дар он аст, ки он ду синф дорад, ки рамзи он дар дохor он навишта шудааст Bicycle- инҳо синфҳо HandleBar(руль) ва Seat(курсӣ) мебошанд. Инҳо синфҳои мукаммал мебошанд: чунон ки шумо мебинед, ҳар кадоми онҳо усулҳои худро доранд. Дар ин лаҳза, шумо шояд саволе дошта бошед: чаро мо як синфро дар дохor дигар гузоштем? Чаро онҳоро дохилӣ месозанд? Хуб, биёед бигӯем, ки барои руль ва курсӣ дар барнома синфҳои алоҳида лозиманд. Аммо ба шумо лозим нест, ки онҳоро лона кунед! Шумо метавонед дарсҳои муқаррарӣ кунед. Масалан, ба ин монанд:
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!");
   }
}
Саволи хеле хуб! Албатта, мо ягон маҳдудияти техникӣ надорем - мо метавонем инро бо ин роҳ анҷом диҳем. Ин бештар дар бораи дуруст тарҳрезии синфҳо аз нуқтаи назари як барномаи мушаххас ва ба маънои он барнома аст. Синфҳои дохилӣ дарсҳо барои нишон додани як an objectи муайян дар барномае мебошанд, ки бо an objectи дигар робитаи ногусастанӣ доранд. Руль, курсӣ, педальҳо ҷузъҳои велосипед мебошанд. Аз дучарха чудо шуда, маъное надоранд. Агар мо ҳамаи ин синфҳоро синфҳои ҷамъиятӣ ҷудо кунем, барномаи мо метавонад, масалан, рамзи зеринро дошта бошад:
public class Main {

   public static void main(String[] args) {
       HandleBar handleBar = new HandleBar();
       handleBar.right();
   }
}
Уммм... Маънои ин codeро шарх додан хам душвор аст. Мо як дастаки аҷиби дучарха дорем (чаро он лозим аст? Росташро гӯям. Ва ин руль ба тарафи рост... худ аз худ, бе велосипед... аз чй сабаб бошад. Мо мохияти рульро аз мохияти велосипед чудо карда, мантики барномаи худро гум кардем. Бо истифода аз синфи дохилӣ, code комилан фарқ мекунад:
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();
   }
}
Натиҷаи консол:

Сиденье поднято выше!
Поехали!
Руль влево!
Руль вправо!
Он чизе ки ногаҳон рӯй дод, маъно дошт! :) Мо an objectи велосипед сохтаем. Мо ду «субъект»-и он — руль ва курсиро офаридаем. Мо курсиро барои роҳат баланд кардем - ва рафтем: мо меғелем ва ба он ҷое ки бояд биравем! :) Усулҳое, ки ба мо лозиманд, дар an objectҳои зарурӣ даъват карда мешаванд. Ҳама чиз оддӣ ва қулай аст. Дар ин мисол, таъкид кардани рутба ва курсӣ инкапсуляцияро беҳтар мекунад (мо маълумотро дар бораи қисмҳои велосипед дар дохor синфи мувофиқ пинҳон мекунем) ва ба мо имкон медиҳад, ки абстраксияи муфассалтар эҷод кунем. Акнун биёед ба вазъияти дигар назар андозем. Фарз мекунем, ки мо мехоҳем барномаеро эҷод кунем, ки мағозаи велосипед ва қисмҳои онро модел кунад. Синфҳои дохилӣ - 4Дар ин вазъият халли пештараи мо барбод меравад. Дар доираи як мағозаи қисмҳо, ҳар як қисми алоҳидаи велосипед ҳатто ба ғайр аз моҳияти дучарха маъно дорад. Масалан, ба мо усулҳо, ба монанди "фурӯши педальҳо ба харидор", "харидани курсии нав" ва ғайра лозиманд. Дар ин чо синфхои дохorро истифода бурдан хато мебуд — хар як кисми алохидаи велосипед дар доираи барномаи нави мо маънои худро дорад: вай аз мохияти велосипед чудо аст ва ба он хеч вобаста нест. Ин аст он чизе, ки шумо бояд ба он диққат диҳед, агар шумо дар ҳайрат бошед, ки оё шумо бояд синфҳои дохorро истифода баред ё ҳамаи an objectҳоро ба синфҳои алоҳида ҷудо кунед. Барномасозии ба an object нигаронидашуда бузург аст, зеро он моделсозии an objectҳои воқеиро осон мекунад. Ин аст он чизест, ки шумо метавонед ҳамчун роҳнамо ҳангоми қарор дар бораи истифодаи синфҳои дохилӣ истифода баред. Дар мағозаи воқеӣ қисмҳо аз велосипедҳо ҷудо карда мешаванд - ин муқаррарӣ аст. Ин маънои онро дорад, ки ин ҳангоми таҳияи барнома дуруст хоҳад буд. Хуб, мо "фалсафа" -ро ҷудо кардем :) Акнун биёед бо хусусиятҳои муҳими "техникии" синфҳои дохилӣ шинос шавем. Ин аст он чизе ки шумо бешубҳа бояд дар хотир доред ва дарк кунед:
  1. Объекти синфи ботинӣ бидуни an objectи синфи "берунӣ" вуҷуд дошта наметавонад.

    Ин мантиқист: барои ҳамин мо онро синфҳои Seatдохилӣ сохтем HandleBar, то рулу курсиҳои бесоҳиб дар барномаи мо дар ин ҷо ва он ҷо пайдо нашаванд.

    Ин code тартиб дода намешавад:

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

    Хусусияти муҳими зерин аз ин бармеояд:

  2. Объекти синфи дохилӣ ба тағирёбандаҳои синфи "берунӣ" дастрасӣ дорад.

    Масалан, биёед Bicycleяк тағирёбандаро ба синфи худ илова кунем int seatPostDiameter- диаметри сутуни нишаст.

    Сипас дар синфи дохилӣ Seatмо метавонем усулеро эҷод кунем 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);
           }
       }
    }

    Ва ҳоло мо метавонем ин маълумотро дар барномаи худ дастрас кунем:

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

    Натиҷаи консол:

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

    Диққат диҳед:тағирёбандаи нав бо сахттарин тағирдиҳанда - эълон карда мешавад private. Ва то ҳол синфи дохилӣ дастрасӣ дорад!

  3. Объекти синфи дохorро дар усули статикии синфи "берунӣ" сохтан мумкин нест.

    Ин бо хусусиятҳои тарҳрезии синфҳои дохилӣ шарҳ дода мешавад. Синфи дохилӣ метавонад конструкторҳо бо параметрҳо ё танҳо созандаи пешфарз дошта бошад. Аммо новобаста аз ин, вақте ки мо an objectи синфи ботиниро эҷод мекунем, истинод ба an objectи синфи "берунӣ" оромона ба он мегузарад. Охир, мавчуд будани чунин an object шарти хатмист. Дар акси ҳол, мо наметавонем an objectҳои синфи дохorро эҷод кунем.

    Аммо агар усули синфи беруна статикӣ бошад, пас an objectи синфи берунӣ метавонад умуман вуҷуд надошта бошад! Ин маънои онро дорад, ки мантиқи синфҳои ботинӣ шикаста мешавад. Дар чунин вазъият, компилятор хато мекунад:

    public static Seat createSeat() {
    
       //Bicycle.this cannot be referenced from a static context
       return new Seat();
    }
  4. Синфи дохилӣ наметавонад дорои тағирёбандаҳо ва усулҳои статикӣ бошад.

    Мантиқ дар ин ҷо як аст: усулҳо ва тағирёбандаҳои статикӣ метавонанд вуҷуд дошта бошанд ва ҳатто агар an object вуҷуд надошта бошад.

    Аммо бе an objectи синфи "берунӣ" мо ба синфи дохилӣ дастрасӣ нахоҳем дошт.

    Як зиддияти возеҳ! Аз ин рӯ, мавҷудияти тағирёбандаҳо ва усулҳои статикӣ дар синфҳои дохилӣ манъ аст.

    Компилятор ҳангоми кӯшиши сохтани онҳо хатогӣ содир мекунад:

    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. Ҳангоми сохтани an objectи синфи дохилӣ, тағирдиҳандаи дастрасии он нақши муҳим мебозад.

    Синфи дохorро метавон бо тағирдиҳандаҳои дастрасии стандартӣ - public, private, protectedва package private.

    Чаро муҳим аст?

    Ин ба он таъсир мерасонад, ки дар барномаи мо мо метавонем синфи дохorро эҷод кунем.

    Агар синфи мо Seatҳамчун , эълон карда шавад public, мо метавонем an objectҳои онро дар ҳама гуна синфи дигар созем. Ягона талабот ин аст, ки an objectи синфи "берунӣ" низ бояд вуҷуд дошта бошад.

    Дар омади гап, мо инро аллакай дар ин ҷо анҷом додаем:

    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();
       }
    }

    Мо ба осонӣ ба синфи дохилӣ HandleBarаз Main.

    Агар мо синфи дохorро ҳамчун , эълон кунем private, мо танҳо ба сохтани an objectҳо дар дохor синфи "берунӣ" дастрасӣ пайдо мекунем.

    SeatМо дигар наметавонем an objectеро аз берун эҷод кунем :

    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();
       }
    }

    Шумо эҳтимолан мантиқро фаҳмед :)

  6. Тағирдиҳандаҳои дастрасӣ барои синфҳои дохилӣ ҳамон тавре ки барои тағирёбандаҳои муқаррарӣ кор мекунанд.

    Тағирдиҳанда protectedдастрасӣ ба тағирёбандаи синфро дар синфҳои насли он ва дар синфҳое, ки дар як баста ҳастанд, таъмин мекунад.

    Ҳамин чиз protectedбарои синфҳои дохилӣ кор мекунад. Объектҳои protectedсинфҳои дохилӣ метавонанд эҷод карда шаванд:

    • дар дохor синфи "берунӣ";
    • дар синфҳои насли он;
    • дар он синфҳое, ки дар як баста ҳастанд.

    Агар синфи дохилӣ тағирдиҳандаи дастрасӣ надошта бошад ( package private), an objectҳои синфи ботиниро эҷод кардан мумкин аст

    • дар дохor синфи "берунӣ";
    • дар синфҳое, ки дар як баста ҳастанд.

    Шумо муддати тӯлонӣ бо тағирдиҳандаҳо шинос ҳастед, бинобар ин дар ин ҷо ягон мушкилот вуҷуд нахоҳад дошт.

Ҳамааш ҳамин аст :) Аммо истироҳат накунед! Синфҳои дохorи дохилӣ як мавзӯи хеле васеъ мебошанд, ки мо дар дарсҳои оянда омӯхтани онро идома хоҳем дод. Акнун шумо метавонед лексияро дар бораи дарсҳои дохилӣ аз курси мо хонед. Ва дафъаи оянда мо дар бораи синфҳои лонаҳои статикӣ сӯҳбат хоҳем кард.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION