JavaRush /Java Blog /Random-TK /Java-da statik üýtgediji barada 10 bellik

Java-da statik üýtgediji barada 10 bellik

Toparda çap edildi
Java-daky statiki üýtgediji synp bilen gönüden-göni baglanyşyklydyr. Meýdan statik bolsa, bu synpa degişlidir, usul statik bolsa, şol bir zat: synpa degişlidir. Şundan ugur alyp, synpyň adyny ulanyp statiki usula ýa-da meýdana girip bilersiňiz. Mysal üçin, hasaplaýyş meýdançasy Counter synpynda statik bolsa, üýtgeýjä: Counter.count ýaly talap bilen girip bilersiňiz. Java-da statiki üýtgediji barada 10 bellik - 1Bellikler bilen başlamazdan ozal, Java-da statikiň nämedigini we nämäniň statik bolup biljekdigini ýadymyzdan çykaralyň (we belki-de tapalyň). Statik, meýdança, blok, usul ýa-da içki synp üçin ulanylýan üýtgediji. Bu üýtgediji, mowzugyň häzirki synpa baglydygyny görkezýär.

Statik meýdanlar

Synp derejesindäki üýtgeýjini görkezenimizde, bahanyň bir klasa degişlidigini görkezýäris. Muny etmeseňiz, üýtgeýjiniň bahasy bu synpy ulanyp döredilen obýekte bagly bolar. Bu näme many berýär? Java-da statik üýtgediji barada 10 bellik - 2Hakykat, eger üýtgeýji statik däl bolsa, onda bu synpyň her täze obýekti, diňe bir obýektde üýtgedenimizi üýtgetmek bilen, bu üýtgeýjiniň öz bahasyna eýe bolar: Mysal üçin, bizde awtoulag synpy bar -statik üýtgeýji:
public class Car {
  int km;
}
Soň bolsa:
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);
Alýan netijämiz:

Orange car - 100
Blue car - 85
Görşüňiz ýaly, her obýektiň öz üýtgeýjisi bar, üýtgemegi diňe şu obýekt üçin bolýar. Statik üýtgeýjimiz bar bolsa, bu global baha hemmeler üçin deňdir: Indi statiki üýtgeýän awtoulag bar:
public class Car {
  static int km;
}
Soňra esasy kod şol bir konsola çykar:

Orange car - 85
Blue car - 85
Galyberse-de, hemmämiz üçin bir üýtgeýji bar we her gezek üýtgedenimizde. Statik üýtgeýjilere adatça obýekt salgylanmasy - orangeCar.km däl-de, synp ady - Car.km girip bolýar.

Statik blok

Iki başlangyç blok bar - yzygiderli we statik. Blok içerki üýtgeýänleri başlatmak üçin niýetlenendir. Blok adaty bolsa, obýektiň içerki üýtgeýjileri onuň bilen başlanýar, ýöne statik bolsa, olara statiki üýtgeýjiler (ýagny synp üýtgeýjileri) bellenilýär. Statiki başlangyç blokly synpyň mysaly:
public class Car {
  static int km;

  static {
     km = 150;
  }
}

Statik usul

Statik usullar yzygiderli usullardan tapawutlanýar, sebäbi olar obýekt däl-de, bir klasa baglydyr. Statik usulyň möhüm aýratynlygy, diňe statiki üýtgeýänlere / usullara girip bilýär. Mysal hökmünde, usul jaňlaryny yzarlaýan hasaplaýjy görnüşi boljak synpa seredeliň:
public class Counter {
  static int count;

  public static void invokeCounter() {
     count++;
     System.out.println("Current counter value - " + count);
  }
}
Esasy diýeliň:
Counter.invokeCounter();
Counter.invokeCounter();
Counter.invokeCounter();
Çykyşy bolsa konsola alýarys:

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

Java-da statik synp

Diňe içki synp statik synp bolup biler. Againene-de bu synp daşarky synp bilen baglanyşdyrylýar we daşarky synp başga bir klasa miras galan bolsa, bu synp miras galmaz. Mundan başga-da, bu synpy beýleki synplardan miras alyp, interfeýsi durmuşa geçirip bolşy ýaly miras alyp bolýar. Aslynda, statiki höwürtgelenen synp, içerki synpdan tapawudy ýok, obýektinde ony döreden daşarky synp obýektine salgylanma ýok. Şeýle-de bolsa, bu statiki synpy adaty höwürtgelemeýän klasa has meňzeýär, sebäbi ýeke-täk tapawut, başga bir klasa örtülenligi. Käbir ýagdaýlarda bu biziň üçin artykmaçlykdyr, sebäbi ondan daşarky synpyň şahsy statiki üýtgeýjilerine girip bileris. Öýlenen statiki synpyň mysaly:
public class Vehicle {

  public static class Car {
     public int km;
  }
}
Bu synpyň mysalyny döretmek we içerki üýtgeýjiniň bahasyny kesgitlemek:
Vehicle.Car car = new Vehicle.Car();
car.km = 90;
Statiki usullary / üýtgeýjileri / synpy ulanmak üçin şol synpyň obýektini döretmek zerurlygy ýok. Elbetde, giriş üýtgedijileri göz öňünde tutulmalydyr. Mysal üçin, meýdanlara privatediňe yglan edilen synpyň içinde girip bolýar. Meýdanlar bukjanyň ( paketiň ) içindäki ähli synplar, şeýle hem bukjanyň daşyndaky ähli miras synplary protectedüçin elýeterlidir . Has giňişleýin maglumat üçin “ Private vs protected vs public ” makalasyna göz aýlaň . Synpda statiki usul bar diýeliň, wezipesi hasaplaýjyny köpeltmek . Bu usula jaň etmek üçin, forma çagyryşyny ulanyp bilersiňiz . Statik meýdana ýa-da usula girmek üçin synpy derrew açmagyň zerurlygy ýok . Bu statiki we NON-statik obýektleriň (synp agzalary) arasyndaky düýpli tapawut. Statik synp agzalarynyň gönüden-göni synpyna degişlidigini ýene bir gezek ýatladýaryn. .Agny, statiki üýtgeýjiniň bahasy ähli görnüşdäki obýektler üçin deň bolar . Soňra bu makalada Java-da statiki üýtgedijini ulanmagyň esasy taraplaryna, şeýle hem esasy programmirleme düşünjelerine düşünmäge kömek etjek käbir aýratynlyklara serederis. increment()CountercountCounter.increment()CountercountCounter

Java-daky Statik üýtgediji barada her bir programmistiň bilmeli zatlary

Bu bölümde statiki usullary, meýdanlary we synplary ulanmagyň esaslaryna serederis. Üýtgeýjilerden başlalyň.
  1. Usul ýa-da blok ýaly statiki kontekstde synpyň statik däl agzalaryna girip bilmersiňiz. Aşakdaky kody düzmek ýalňyşlyga sebäp bolar:

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

    Bu, Java programmistleriniň, esasanam täze doglan çagalaryň iň köp ýaýran ýalňyşlyklaryndan biridir. Usul mainstatik, ýöne üýtgeýji countýok bolany üçin, bu ýagdaýda printlnusulyň içindäki usul main“Kompile wagt ýalňyşlygy” atar.

  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. Serializasiýa wagtynda, üýtgeýjiler ýaly transient, statiki meýdanlar seriýalanmaýar. Hakykatdanam, statiki meýdanda haýsydyr bir maglumatlary ýatda saklasaňyz, deserializasiýa edilenden soň täze obýekt esasy (başlangyç) bahasyny öz içine alar, mysal üçin, statiki meýdan üýtgeýän bolsa, intdeserializasiýa edilenden soň onuň bahasy nola deň bolar, eger görnüşi float0.0, görnüşi bolsa Object- null. Dogrusyny aýtsak, bu Java söhbetdeşliklerinde serializasiýa bilen baglanyşykly iň köp berilýän soraglaryň biridir. Obýekt hakda iň möhüm maglumatlary statiki meýdanda saklamaň!

  10. Iň soňunda bolsa gürleşeliň static import. Bu üýtgedijiniň adaty operator bilen köp umumylygy bar import, ýöne ondan tapawutlylykda synpyň bir ýa-da ähli statiki agzalaryny import etmäge mümkinçilik berýär. Statiki usullary import edenlerinde, şol bir synpda kesgitlenen ýaly girip bolýar, meýdanlar import edilende, synpyň adyny görkezmezden olara girip bileris. Bu aýratynlyk Java 1.5 wersiýasynda girizildi we dogry ulanylanda koduň okalmagyny ýokarlandyrýar. Bu gurluşyk köplenç JUnit synaglarynda bolýar , sebäbi Synag işläp düzüjileriň hemmesi diýen ýaly static importtassyklamak usullaryny ulanýarlar assertEquals()we olaryň aşa köpeldilen dublikatlary. Hiç zat düşnüksiz bolsa, goşmaça maglumat üçin hoş geldiňiz .

Bu hemmesi. Her bir programmist Java-daky statiki üýtgediji barada ýokardaky nokatlaryň hemmesini bilmelidir . Bu makalada statiki üýtgeýjiler, meýdanlar, usullar, başlangyç bloklar we import barada esasy maglumatlar bar. Java-da programmalar ýazylanda we düşünilende möhüm ähmiýete eýe bolan käbir möhüm aýratynlyklary öz içine alýar. Her bir dörediji statiki düşünjeleri ulanmakda başarnyklaryny kämilleşdirer diýip umyt edýärin, sebäbi ... Bu çynlakaý programmirlemek üçin gaty möhümdir ".
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION