JavaRush /Java Blogu /Random-AZ /Java-da Statik Modifikator haqqında 10 Qeyd

Java-da Statik Modifikator haqqında 10 Qeyd

Qrupda dərc edilmişdir
Java-da statik dəyişdirici birbaşa siniflə əlaqələndirilir. Sahə statikdirsə, o, sinfə aiddir, metod statikdirsə, eynidir: sinfə aiddir. Buna əsaslanaraq, siz sinif adından istifadə edərək statik metod və ya sahəyə daxil ola bilərsiniz. Məsələn, əgər sayma sahəsi Counter sinfində statikdirsə, onda siz dəyişənə aşağıdakı kimi sorğu ilə daxil ola bilərsiniz: Counter.count. Java-da Statik Modifikator haqqında 10 Qeyd - 1Qeydlərə başlamazdan əvvəl Java-da statikin nə olduğunu və nəyin statik ola biləcəyini xatırlayaq (və bəlkə də öyrənək). Statik sahəyə, bloka, metoda və ya daxili sinifə tətbiq edilən dəyişdiricidir. Bu dəyişdirici mövzunun cari sinifə bağlı olduğunu göstərir.

Statik sahələr

Sinif səviyyəli dəyişəni işarə etdikdə, dəyərin sinfə aid olduğunu göstəririk. Bunu etməsəniz, dəyişənin dəyəri bu sinifdən istifadə edərək yaradılmış obyektə bağlanacaq. Bunun mənası nədi? Java-da Statik Modifikator haqqında 10 Qeyd - 2Və fakt budur ki, əgər dəyişən statik deyilsə, bu sinfin hər bir yeni obyekti bu dəyişənin öz dəyərinə sahib olacaq, onu dəyişdirərək onu yalnız bir obyektdə dəyişdiririk: Məsələn, bizdə qeyri-mövcut olan Car sinifimiz var. -statik dəyişən:
public class Car {
  int km;
}
Sonra əsas olaraq:
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);
Aldığımız nəticə:

Orange car - 100
Blue car - 85
Gördüyünüz kimi, hər bir obyektin öz dəyişəni var, dəyişməsi yalnız bu obyekt üçün baş verir. Yaxşı, əgər statik dəyişənimiz varsa, bu qlobal dəyər hamı üçün eynidir: İndi bizdə statik dəyişənli Avtomobil var:
public class Car {
  static int km;
}
Sonra əsasdakı eyni kod konsola çıxacaq:

Orange car - 85
Blue car - 85
Axı bizim hamımız üçün bir dəyişən var və onu hər dəfə dəyişdiririk. Statik dəyişənlərə adətən obyekt istinadı - orangeCar.km deyil, sinif adı - Car.km ilə daxil olur.

Statik blok

İki başlanğıc bloku var - müntəzəm və statik. Blok daxili dəyişənləri işə salmaq üçün nəzərdə tutulub. Əgər blok normaldırsa, onda obyektin daxili dəyişənləri onunla inisiallaşdırılır, lakin statikdirsə, onlara statik dəyişənlər (yəni sinif dəyişənləri) təyin edilir. Statik başlanğıc bloku olan bir sinif nümunəsi:
public class Car {
  static int km;

  static {
     km = 150;
  }
}

Statik üsul

Statik metodlar adi metodlardan onunla fərqlənir ki, onlar həm də obyektə deyil, sinifə bağlıdırlar. Statik metodun mühüm xüsusiyyəti onun yalnız statik dəyişənlərə/metodlara daxil ola bilməsidir. Nümunə olaraq, metod çağırışlarını izləyən bir növ sayğac olacaq sinfə baxaq:
public class Counter {
  static int count;

  public static void invokeCounter() {
     count++;
     System.out.println("Current counter value - " + count);
  }
}
Onu əsas adlandıraq:
Counter.invokeCounter();
Counter.invokeCounter();
Counter.invokeCounter();
Və çıxışı konsola alırıq:

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

Java-da statik sinif

Yalnız daxili sinif statik sinif ola bilər. Yenə də bu sinif xarici sinifə bağlıdır və əgər xarici sinif başqa bir sinfə miras qalıbsa, bu sinif irsi olaraq keçməyəcək. Üstəlik, bu sinif hər hansı digər sinifdən miras alına və interfeys həyata keçirə bildiyi kimi miras alına bilər. Əsasən, statik yuvalanmış sinif hər hansı digər daxili sinifdən fərqlənmir, yalnız onun obyektində onu yaradan xarici sinif obyektinə istinad yoxdur. Bununla belə, bu, statik sinfi adi yuvalanmamış sinfə ən çox bənzədir, çünki yeganə fərq onun başqa bir sinifə bükülmüş olmasıdır. Bəzi hallarda, bu, bizim üçün bir üstünlükdür, çünki ondan xarici sinfin özəl statik dəyişənlərinə çıxışımız var. İç-içə statik sinif nümunəsi:
public class Vehicle {

  public static class Car {
     public int km;
  }
}
Bu sinfin nümunəsini yaratmaq və daxili dəyişənin dəyərini təyin etmək:
Vehicle.Car car = new Vehicle.Car();
car.km = 90;
Statik metodlardan/dəyişənlərdən/sinifdən istifadə etmək üçün həmin sinfin obyektini yaratmağa ehtiyacımız yoxdur. Əlbəttə ki, giriş modifikatorları nəzərə alınmalıdır. Məsələn, sahələr privateyalnız elan olunduğu sinif daxilində əlçatandır. Sahələr paket ( paket ) daxilindəki bütün siniflər üçün, həmçinin paketdən kənar bütün nəsil siniflər üçün protectedəlçatandır . Daha ətraflı məlumat üçün “ özəl vs qorunan vs ictimai ” məqaləsinə baxın . Fərz edək ki , sinifdə vəzifəsi sayğacı artırmaq olan statik metod var . Bu metodu çağırmaq üçün formanın çağırışından istifadə edə bilərsiniz . Statik sahəyə və ya metoda daxil olmaq üçün sinfi yaratmağa ehtiyac yoxdur . Statik və qeyri-statik obyektlər (sinif üzvləri) arasındakı əsas fərq budur. Bir daha xatırlatmaq istəyirəm ki, statik sinif üzvləri onun instansiyasına deyil, birbaşa sinfə aiddir. Yəni statik dəyişənin qiyməti tipli bütün obyektlər üçün eyni olacaq . Bu məqalənin sonrakı hissəsində biz Java-da statik dəyişdiricidən istifadənin əsas aspektlərinə, həmçinin əsas proqramlaşdırma anlayışlarını başa düşməyə kömək edəcək bəzi funksiyalara baxacağıq. increment()CountercountCounter.increment()CountercountCounter

Hər bir proqramçı Java-da Statik dəyişdirici haqqında nə bilməlidir

Bu bölmədə biz statik metodlardan, sahələrdən və siniflərdən istifadənin əsaslarına baxacağıq. Dəyişənlərdən başlayaq.
  1. Siz metod və ya blok kimi statik kontekstdə sinfin qeyri-statik üzvlərinə daxil ola bilməzsiniz. Aşağıdakı kodun tərtib edilməsi xəta ilə nəticələnəcək:

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

    Bu, Java proqramçılarının, xüsusən də yeni başlayanların ən çox etdiyi səhvlərdən biridir. Metod mainstatikdir, lakin dəyişən countdeyil, bu halda printlnmetodun içindəki metod main“Tərtib etmə vaxtı xətası” atacaq.

  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. Serializasiya zamanı, dəyişənlər kimi transient, statik sahələr də seriallaşdırılmır. Həqiqətən, hər hansı bir məlumatı statik bir sahədə saxlayırsınızsa, seriyadan çıxarıldıqdan sonra yeni obyekt ilkin (defolt) dəyərini ehtiva edəcək, məsələn, statik sahə tipli bir dəyişən idisə int, seriyadan çıxarıldıqdan sonra onun dəyəri sıfır olacaq, əgər növü float0.0, əgər növü Objectnull. Düzünü desəm, bu Java müsahibələrində seriallaşdırma ilə bağlı ən çox verilən suallardan biridir. Obyekt haqqında ən vacib məlumatları statik sahədə saxlamayın!

  10. Və nəhayət, haqqında danışaq static import. Bu modifikatorun standart operatorla çoxlu ortaq cəhətləri var import, lakin ondan fərqli olaraq o, sinfin bir və ya bütün statik üzvlərini idxal etməyə imkan verir. Statik metodları idxal edərkən, onlara eyni sinifdə müəyyən edilmiş kimi daxil olmaq olar, eynilə sahələri idxal edərkən biz onlara sinif adını göstərmədən daxil ola bilərik. Bu funksiya Java 1.5 versiyasında təqdim edilib və düzgün istifadə edildikdə kodun oxunuşunu yaxşılaşdırır. Bu tikinti ən çox JUnit testlərində tapılır , çünki Demək olar ki, bütün test tərtibatçıları static import, məsələn, təsdiq metodlarından assertEquals()və onların həddən artıq yüklənmiş dublikatlarından istifadə edirlər. Heç bir şey aydın deyilsə, əlavə məlumat üçün xoş gəlmisiniz .

Hamısı budur. Hər bir proqramçı Java-da statik dəyişdirici haqqında yuxarıda göstərilən bütün məqamları bilməlidir . Bu məqalə statik dəyişənlər, sahələr, metodlar, başlanğıc blokları və idxal haqqında əsas məlumatları əhatə edirdi. Java-da proqramların yazılması və başa düşülməsi zamanı biliyi mühüm əhəmiyyət kəsb edən bəzi vacib xüsusiyyətlər daxildir. Ümid edirəm ki, hər bir tərtibatçı statik anlayışlardan istifadə bacarıqlarını təkmilləşdirəcək, çünki... Bu, ciddi proqramlaşdırma üçün çox vacibdir”.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION