JavaRush /Блоги Java /Random-TG /10 Қайдҳо дар бораи тағирдиҳандаи статикӣ дар Java

10 Қайдҳо дар бораи тағирдиҳандаи статикӣ дар Java

Дар гурӯҳ нашр шудааст
Тағирдиҳандаи статикӣ дар Java мустақиман бо синф алоқаманд аст. Агар майдон статикӣ бошад, он ба синф тааллуқ дорад, агар метод статикӣ бошад, он якхела аст: он ба синф тааллуқ дорад. Дар асоси ин, шумо метавонед бо истифода аз номи синф ба усул ё майдони статикӣ дастрасӣ пайдо кунед. Масалан, агар майдони ҳисоб дар синфи Counter статикӣ бошад, шумо метавонед ба тағирёбанда бо дархости монанди: Counter.count дастрасӣ пайдо кунед. 10 Қайдҳо дар бораи тағирдиҳандаи статикӣ дар Java - 1Пеш аз он ки мо бо ёддоштҳо оғоз кунем, биёед дар хотир дорем (ва шояд бифаҳмем), ки статикӣ чист ва дар Java чӣ статикӣ буда метавонад. Static як тағирдиҳандаест, ки ба майдон, блок, усул ё синфи дохилӣ истифода мешавад. Ин тағирдиҳанда нишон медиҳад, ки мавзӯъ ба синфи ҷорӣ вобаста аст.

Майдонҳои статикӣ

Вақте ки мо тағирёбандаи сатҳи синфро нишон медиҳем, мо нишон медиҳем, ки арзиш ба синф тааллуқ дорад. Агар шумо ин корро накунед, он гоҳ арзиши тағирёбанда ба an objectи бо истифода аз ин синф сохташуда пайваст карда мешавад. Ин чӣ маъно дорад? 10 Қайдҳо дар бораи тағирдиҳандаи статикӣ дар Java - 2Ва ҳақиқат ин аст, ки агар тағирёбанда статикӣ набошад, пас ҳар як an objectи нави ин синф арзиши худии ин тағирёбанда хоҳад дошт, ки бо тағир додани он мо онро танҳо дар як an object тағир медиҳем: Масалан, мо синфи Car дорем бо ғайри -тағйирёбандаи статикӣ:
public class Car {
  int km;
}
Сипас дар асоси:
Car orangeCar = new Car();
orangeCar.km = 100;

Car blueCar = new Car();
blueCar.km = 85;

System.out.println("Orange car - " + orangeCar.km);
System.out.println("Blue car - " + blueCar.km);
Натиҷаи мо ин аст:

Orange car - 100
Blue car - 85
Тавре ки шумо мебинед, ҳар як an object тағирёбандаи худро дорад, ки тағирёбии он танҳо барои ин an object сурат мегирад. Хуб, агар мо як тағирёбандаи статикӣ дошта бошем, пас ин арзиши глобалӣ барои ҳама якхела аст: Ҳоло мо Мошин дорем бо тағирёбандаи статикӣ:
public class Car {
  static int km;
}
Пас ҳамон code дар main ба консол мебарояд:

Orange car - 85
Blue car - 85
Дар ниҳоят, мо барои ҳамаи мо як тағирёбанда дорем ва ҳар дафъае, ки мо онро иваз мекунем. Ба тағирёбандаҳои статикӣ одатан на тавассути истинод ба an object - orangeCar.km, балки бо номи синф - Car.km дастрасӣ пайдо мекунанд.

Блоки статикӣ

Ду блоки оғозёбӣ мавҷуданд - муқаррарӣ ва статикӣ. Блок барои оғоз кардани тағирёбандаҳои дохилӣ пешбинӣ шудааст. Агар блок муқаррарӣ бошад, пас тағирёбандаҳои дохorи an object бо он оғоз карда мешаванд, аммо агар он статикӣ бошад, пас ба онҳо тағирёбандаҳои статикӣ (яъне тағирёбандаҳои синфӣ) таъин карда мешаванд. Намунаи синф бо блоки ибтидоии статикӣ:
public class Car {
  static int km;

  static {
     km = 150;
  }
}

Усули статикӣ

Усулҳои статикӣ аз усулҳои муқаррарӣ бо он фарқ мекунанд, ки онҳо инчунин ба синф вобастаанд, на ба an object. Хусусияти муҳими усули статикӣ дар он аст, ки он метавонад танҳо ба тағирёбандаҳо/усулҳои статикӣ дастрасӣ пайдо кунад. Ҳамчун мисол, биёед синферо бубинем, ки як навъ ҳисобкунак хоҳад буд, ки зангҳои методиро пайгирӣ мекунад:
public class Counter {
  static int count;

  public static void invokeCounter() {
     count++;
     System.out.println("Current counter value - " + count);
  }
}
Биёед онро дар асосӣ даъват кунем:
Counter.invokeCounter();
Counter.invokeCounter();
Counter.invokeCounter();
Ва мо натиҷаро ба консол мегирем:

Текущее meaning счётчика - 1
Текущее meaning счётчика - 2
Текущее meaning счётчика - 3

Синфи статикӣ дар Java

Танҳо синфи дохилӣ метавонад синфи статикӣ бошад. Боз ин синф ба синфи беруна вобаста аст ва агар синфи берунӣ ба синфи дигар мерос бошад, пас ин синф мерос нахоҳад монд. Ғайр аз он, ин синфро метавон мерос гирифт, ҳамон тавре ки он метавонад аз ҳама гуна синфи дигар мерос гирифта шавад ва интерфейсро амалӣ кунад. Аслан, синфи лонашудаи статикӣ аз дигар синфҳои дохилӣ фарқ надорад, ба истиснои он ки an objectи он истинод ба an objectи синфи беруние, ки онро офаридааст, дар бар намегирад. Аммо, ин як синфи статикиро ба синфи муқаррарии лонанашуда бештар монанд мекунад, зеро ягона фарқият дар он аст, ки он дар синфи дигар печонида шудааст. Дар баъзе мавридҳо, ин барои мо бартарӣ аст, зеро аз он мо ба тағирёбандаҳои хусусии статикии синфи берунӣ дастрасӣ дорем. Намунаи синфи статикии лона:
public class Vehicle {

  public static class Car {
     public int km;
  }
}
Эҷоди як мисоли ин синф ва муқаррар кардани арзиши тағирёбандаи дохилӣ:
Vehicle.Car car = new Vehicle.Car();
car.km = 90;
Барои истифодаи усулҳои статикӣ/тағйирёбандаҳо/синф ба мо лозим нест, ки an objectи он синфро созем. Албатта, тағирдиҳандаҳои дастрасӣ бояд ба назар гирифта шаванд. Масалан, майдонҳо privateтанҳо дар дохor синфе, ки дар он эълон карда шудаанд, дастрасанд. Майдонҳо барои ҳама синфҳои дохor баста ( баста ), инчунин ба ҳама синфҳои насли берун аз баста protectedдастрасанд . Барои тафсилоти бештар, мақолаи " хусусӣ ва муҳофизатшуда ва ҷамъиятӣ " -ро санҷед . Фарз мекунем, ки дар синф усули статикӣ мавҷуд аст, ки вазифаи он зиёд кардани ҳисобкунак аст . Барои даъват кардани ин усул, шумо метавонед даъвати формаро истифода баред . Барои ворид шудан ба майдон ё усули статикӣ зарурати эҷоди синф вуҷуд надорад . Ин фарқи асосии байни an objectҳои статикӣ ва ғайристатикӣ (аъзоёни синф) мебошад. Бори дигар хотиррасон мекунам, ки аъзоёни синфҳои статикӣ бевосита ба синф тааллуқ доранд, на ба мисоли он. Яъне, арзиши тағирёбандаи статикӣ барои ҳама an objectҳои навъи якхела хоҳад буд . Баъдтар дар ин мақола мо ҷанбаҳои асосии истифодаи тағирдиҳандаи статикӣ дар Java ва инчунин баъзе хусусиятҳоро, ки ба шумо дар фаҳмидани мафҳумҳои асосии барномасозӣ кӯмак мекунанд, дида мебароем. increment()CountercountCounter.increment()CountercountCounter

Он чизеро, ки ҳар як барномасоз бояд дар бораи тағирдиҳандаи статикӣ дар Java донад

Дар ин бахш мо асосҳои истифодаи усулҳои статикӣ, майдонҳо ва синфҳоро дида мебароем. Биёед бо тағирёбандаҳо оғоз кунем.
  1. Шумо наметавонед ба аъзои ғайристатикии синф дар дохor контексти статикӣ, ба монанди усул ё блок дастрасӣ пайдо кунед. Тартиб додани codeи дар поён овардашуда ба хатогӣ оварда мерасонад:

    public class Counter{
    private int count;
    public static void main(String args[]){
       System.out.println(count); //compile time error
    }}

    Ин яке аз хатогиҳои маъмултаринест, ки аз ҷониби барномасозони Java, бахусус навкорон, содир мешавад. Азбаски усул mainстатикӣ аст, аммо тағирёбанда countнест, дар ин ҳолат усул printlnдар дохor усул main"Хатои вақти тартибдиҳӣ" -ро мепартояд.

  2. В отличие от локальных переменных, статические поля и методы НЕ потокобезопасны (Thread-safe) в Java. На практике это одна из наиболее частых причин возникновения проблем связанных с безопасностью мультипоточного программирования. Учитывая что каждый экземпляр класса имеет одну и ту же копию статической переменной, то такая переменная нуждается в защите — «залочивании» классом. Поэтому при использовании статических переменных, убедитесь, что они должным образом синхронизированы (synchronized), во избежание проблем, например таких How «состояние гонки» (race condition).

  3. Статические методы имеют преимущество в применении, т.к. отсутствует необходимость каждый раз создавать новый an object для доступа к таким методам. Статический метод можно вызвать, используя тип класса, в котором эти методы описаны. Именно поэтому, подобные методы How нельзя лучше подходят в качестве методов-фабрик (factory), и методов-утorт (utility). Класс java.lang.Math — замечательный пример, в котором почти все методы статичны, по этой же причине классы-утorты в Java финализированы (final).

  4. Другим важным моментом является то, что вы НЕ можете переопределять (Override) статические методы. Если вы объявите такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, вы лишь «спрячете» метод суперкласса (superclass) instead of переопределения. Это явление известно How сокрытие методов (hiding methods). Это означает, что при обращении к статическому методу, который объявлен How в родительском, так и в дочернем классе, во время компиляции всегда будет вызван метод исходя из типа переменной. В отличие от переопределения, такие методы не будут выполнены во время работы программы. Рассмотрим пример:

    class Vehicle{
         public static void  kmToMiles(int km){
              System.out.println("Inside parent class/static method");
         } }
    
    class Car extends Vehicle{
         public static void  kmToMiles(int km){
              System.out.println("Inside child class/static method ");
         } }
    
    public class Demo{
       public static void main(String args[]){
          Vehicle v = new Car();
           v.kmToMiles(10);
      }}

    Вывод в консоль:

    Внутри родительского класса/статического метода

    Код наглядно демонстрирует: несмотря на то, что an object имеет тип Car, вызван статический метод из класса Vehicle, т.к. произошло обращение к методу во время компиляции. И заметьте, ошибки во время компиляции не возникло!

  5. Объявить статическим также можно и класс, за исключением классов верхнего уровня. Такие классы известны How «вложенные статические классы» (nested static class). Они бывают полезными для представления улучшенных связей. Яркий пример вложенного статического класса — HashMap.Entry, который предоставляет структуру данных внутри HashMap. Стоит заметить, также How и любой другой внутренний класс, вложенные классы находятся в отдельном файле .class. Таким образом, если вы объявor пять вложенных классов в вашем главном классе, у вас будет 6 файлов с расширением .class. Ещё одним примером использования является объявление собственного компаратора (Comparator), например компаратор по возрасту (AgeComparator) в классе сотрудники (Employee).

  6. Модификатор static также может быть объявлен в статичном блоке, более известным How «Статический блок инициализации» (Static initializer block), который будет выполнен во время загрузки класса. Если вы не объявите такой блок, то Java соберёт все статические поля в один список и выполнит его во время загрузки класса. Однако, статичный блок НЕ может пробросить перехваченные исключения, но может выбросить не перехваченные. В таком случае возникнет «Exception Initializer Error». На практике, любое исключение возникшее во время выполнения и инициализации статических полей, будет завёрнуто Java в эту ошибку. Это также самая частая причина ошибки «No Class Def Found Error», т.к. класс не находился в памяти во время обращения к нему.

  7. Полезно знать, что статические методы связываются во время компиляции, в отличие от связывания виртуальных or не статических методов, которые связываются во время исполнения на реальном an objectе. Следовательно, статические методы не могут быть переопределены в Java, т.к. полиморфизм во время выполнения не распространяется на них. Это важное ограничение, которое необходимо учитывать, объявляя метод статическим. В этом есть смысл, только тогда, когда нет возможности or необходимости переопределения такого метода классами-наследниками. Методы-фабрики и методы-утorты хорошие образцы применения модификатора static. Джошуа Блох выделил несколько преимуществ использования статичного метода-фабрики перед конструктором, в книге «Effective Java», которая является обязательной для прочтения каждым программистом данного языка.

  8. Важным свойством статического блока является инициализация. Статические поля or переменные инициализируются после загрузки класса в память. Порядок инициализации сверху вниз, в том же порядке, в Howом они описаны в исходном файле Java класса. Поскольку статические поля инициализируются на потокобезопасный манер, это свойство также используется для реализации паттерна Singleton. Если вы не используется список Enum How Singleton, по тем or иным причинам, то для вас есть хорошая альтернатива. Но в таком случае необходимо учесть, что это не «ленивая» инициализация. Это означает, что статическое поле будет проинициализировано ещё ДО того How кто-нибудь об этом «попросит». Если an object ресурсоёмкий or редко используется, то инициализация его в статическом блоке сыграет не в вашу пользу.

  9. Ҳангоми силсиласозӣ, ба монанди transientтағирёбандаҳо, майдонҳои статикӣ сериализатсия карда намешаванд. Воқеан, агар шумо ягон маълумотро дар майдони статикӣ захира кунед, пас аз бесериализатсия an objectи нав дорои арзиши ибтидоии (пешфарз) мешавад, масалан, агар майдони статикӣ тағирёбандаи навъи бошад int, пас арзиши он пас аз бесериализатсия сифр хоҳад буд, агар навъи float0,0 аст, агар навъи Object- null. Ростқавлона, ин яке аз саволҳои маъмултарин дар бораи сериализатсия дар мусоҳибаҳои Java мебошад. Маълумоти муҳимтаринро дар бораи an object дар майдони статикӣ нигоҳ надоред!

  10. Ва дар охир, биёед дар бораи static import. Ин тағирдиҳанда бо оператори стандартӣ умумӣ дорад import, аммо бар хилофи он, он ба шумо имкон медиҳад, ки як ё ҳамаи аъзои статикии синфро ворид кунед. Ҳангоми воридоти усулҳои статикӣ, онҳо метавонанд дастрас шаванд, ки гӯё онҳо дар як синф муайян карда шуда бошанд, ба ин монанд ҳангоми воридоти майдонҳо, мо метавонем ба онҳо бе нишон додани номи синф дастрасӣ пайдо кунем. Ин хусусият дар versionи Java 1.5 ҷорӣ карда шудааст ва ҳангоми истифодаи дуруст, хондани codeро беҳтар мекунад. Ин сохтмон аксар вақт дар санҷишҳои JUnit пайдо мешавад , зеро Қариб ҳамаи таҳиягарони тестҳо static importусулҳои тасдиқкуниро истифода мебаранд, масалан, assertEquals()ва нусхаҳои аз ҳад зиёди онҳо. Агар ҳеҷ чиз равшан набошад, барои маълумоти иловагӣ хуш омадед .

Ҳамааш ҳамин. Ҳар як барномасоз бояд ҳамаи нуктаҳои дар боло зикршударо дар бораи тағирдиҳандаи статикӣ дар Java донад . Ин мақола маълумоти асосиро дар бораи тағирёбандаҳои статикӣ, майдонҳо, усулҳо, блокҳои оғозёбӣ ва воридот фаро гирифтааст. Аз ҷумла баъзе хосиятҳои муҳим, ки дониши онҳо ҳангоми навиштан ва фаҳмидани барномаҳо дар Java муҳим аст. Ман умедворам, ки ҳар як таҳиягар малакаҳои худро дар истифодаи консепсияҳои статикӣ такмил медиҳад, зеро ... Ин барои барномасозии ҷиддӣ хеле муҳим аст."
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION