JavaRush /Java blogi /Random-UZ /Java-dagi statik modifikator bo'yicha 10 ta eslatma

Java-dagi statik modifikator bo'yicha 10 ta eslatma

Guruhda nashr etilgan
Java-dagi statik modifikator bevosita sinf bilan bog'langan. Agar maydon statik bo'lsa, u sinfga tegishli, agar usul statik bo'lsa, u bir xil: u sinfga tegishli. Shunga asoslanib, sinf nomidan foydalanib, statik usul yoki maydonga kirishingiz mumkin. Misol uchun, agar Counter sinfida hisoblash maydoni statik bo'lsa, siz o'zgaruvchiga quyidagi so'rov bilan kirishingiz mumkin: Counter.count. Java-dagi statik modifikator bo'yicha 10 ta eslatma - 1Eslatmalar bilan boshlashdan oldin, keling, Java-da statik nima ekanligini va nima statik bo'lishi mumkinligini eslaylik (va ehtimol bilib olaylik). Statik - bu maydon, blok, usul yoki ichki sinfga qo'llaniladigan modifikator. Ushbu modifikator mavzuning joriy sinfga bog'langanligini bildiradi.

Statik maydonlar

Biz sinf darajasidagi o'zgaruvchini belgilaganimizda, qiymat sinfga tegishli ekanligini ko'rsatamiz. Agar buni qilmasangiz, o'zgaruvchining qiymati ushbu sinf yordamida yaratilgan ob'ektga bog'lanadi. Bu nima degani? Java-dagi Statik Modifikator bo'yicha 10 ta eslatma - 2Va haqiqat shundaki, agar o'zgaruvchi statik bo'lmasa, bu sinfning har bir yangi ob'ekti ushbu o'zgaruvchining o'ziga xos qiymatiga ega bo'ladi, uni o'zgartirish orqali biz uni faqat bitta ob'ektda o'zgartiramiz: Masalan, bizda bo'lmagan Car sinfi mavjud. -statik o'zgaruvchi:
public class Car {
  int km;
}
Keyin asosiy:
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);
Biz olgan natija:

Orange car - 100
Blue car - 85
Ko'rib turganingizdek, har bir ob'ektning o'z o'zgaruvchisi bor, uning o'zgarishi faqat shu ob'ekt uchun sodir bo'ladi. Agar bizda statik o'zgaruvchi bo'lsa, bu global qiymat hamma uchun bir xil bo'ladi: Endi bizda statik o'zgaruvchiga ega Avtomobil bor:
public class Car {
  static int km;
}
Keyin asosiy koddagi bir xil kod konsolga chiqadi:

Orange car - 85
Blue car - 85
Axir, bizda hammamiz uchun bitta o'zgaruvchi bor va biz uni har safar o'zgartiramiz. Statik o'zgaruvchilarga odatda ob'ekt havolasi - orangeCar.km orqali emas, balki sinf nomi - Car.km orqali kirish mumkin.

Statik blok

Ikkita ishga tushirish bloklari mavjud - muntazam va statik. Blok ichki o'zgaruvchilarni ishga tushirish uchun mo'ljallangan. Agar blok normal bo'lsa, u holda ob'ektning ichki o'zgaruvchilari u bilan inisializatsiya qilinadi, lekin agar u statik bo'lsa, ularga statik o'zgaruvchilar (ya'ni sinf o'zgaruvchilari) tayinlanadi. Statik ishga tushirish blokiga ega sinfga misol:
public class Car {
  static int km;

  static {
     km = 150;
  }
}

Statik usul

Statik usullar oddiy usullardan ob'ektga emas, balki sinfga ham bog'langanligi bilan farq qiladi. Statik usulning muhim xususiyati shundaki, u faqat statik o'zgaruvchilar/usullarga kirishi mumkin. Misol tariqasida, usul chaqiruvlarini kuzatib boruvchi hisoblagich turi bo'ladigan sinfni ko'rib chiqamiz:
public class Counter {
  static int count;

  public static void invokeCounter() {
     count++;
     System.out.println("Current counter value - " + count);
  }
}
Keling, uni asosiy deb ataymiz:
Counter.invokeCounter();
Counter.invokeCounter();
Counter.invokeCounter();
Va biz konsolga chiqishni olamiz:

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

Java-da statik sinf

Faqat ichki sinf statik sinf bo'lishi mumkin. Shunga qaramay, bu sinf tashqi sinfga bog'langan va agar tashqi sinf boshqa sinfga meros bo'lib qolgan bo'lsa, u holda bu meros bo'lmaydi. Bundan tashqari, bu sinf boshqa har qanday sinfdan meros qilib olinishi va interfeysni amalga oshirishi mumkin bo'lganidek, meros qilib olinishi mumkin. Aslida, statik ichki sinf boshqa ichki sinflardan farq qilmaydi, faqat uning ob'ekti uni yaratgan tashqi sinf ob'ektiga havolani o'z ichiga olmaydi. Biroq, bu statik sinfni oddiy ichki o'rnatilmagan sinfga eng o'xshash qiladi, chunki yagona farq shundaki, u boshqa sinfga o'ralgan. Ba'zi hollarda, bu biz uchun afzallikdir, chunki undan biz tashqi sinfning shaxsiy statik o'zgaruvchilariga kirishimiz mumkin. Ichki statik sinfga misol:
public class Vehicle {

  public static class Car {
     public int km;
  }
}
Ushbu sinfning namunasini yaratish va ichki o'zgaruvchining qiymatini o'rnatish:
Vehicle.Car car = new Vehicle.Car();
car.km = 90;
Statik usullar/o'zgaruvchilar/sinflardan foydalanish uchun biz ushbu sinf ob'ektini yaratishimiz shart emas. Albatta, kirish modifikatorlarini hisobga olish kerak. Masalan, maydonlarga privatefaqat ular e'lon qilingan sinfda kirish mumkin. Maydonlar paket ( paket ) ichidagi barcha sinflar uchun, shuningdek paketdan tashqaridagi barcha irsiy sinflar uchun protectedmavjud . Batafsil ma'lumot uchun " xususiy va himoyalangan va ommaviy " maqolasini ko'rib chiqing . Faraz qilaylik , sinfda hisoblagichni oshirish vazifasi bo'lgan statik usul mavjud . Ushbu usulni chaqirish uchun siz forma chaqiruvidan foydalanishingiz mumkin . Statik maydon yoki usulga kirish uchun sinfni yaratishning hojati yo'q . Bu statik va statik bo'lmagan ob'ektlar (sinf a'zolari) o'rtasidagi asosiy farq. Yana bir bor eslatib o'tamanki, statik sinf a'zolari bevosita sinfga tegishli, uning misoliga emas. Ya'ni, statik o'zgaruvchining qiymati barcha turdagi ob'ektlar uchun bir xil bo'ladi . Ushbu maqolaning keyingi qismida biz Java-da statik modifikatordan foydalanishning asosiy jihatlarini, shuningdek, asosiy dasturlash tushunchalarini tushunishga yordam beradigan ba'zi xususiyatlarni ko'rib chiqamiz. increment()CountercountCounter.increment()CountercountCounter

Har bir dasturchi Java-dagi Statik modifikator haqida nimani bilishi kerak

Ushbu bo'limda biz statik usullar, maydonlar va sinflardan foydalanish asoslarini ko'rib chiqamiz. Keling, o'zgaruvchilardan boshlaylik.
  1. Siz statik kontekstda, masalan, usul yoki blokda sinfning statik bo'lmagan a'zolariga kira olmaysiz. Quyidagi kodni kompilyatsiya qilish xatolikka olib keladi:

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

    Bu Java dasturchilari, ayniqsa yangi boshlanuvchilar tomonidan eng ko'p uchraydigan xatolardan biridir. Usul mainstatik bo'lgani uchun, lekin o'zgaruvchi countemas, bu holda printlnusul ichidagi usul main"Tuzish vaqti xatosi" ni chiqaradi.

  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. Seriyalash paytida, xuddi transiento'zgaruvchilar kabi, statik maydonlar ketma-ketlashtirilmaydi. Haqiqatan ham, agar siz biron bir ma'lumotni statik maydonda saqlasangiz, seriyani bekor qilgandan so'ng, yangi ob'ekt o'zining asosiy (standart) qiymatini o'z ichiga oladi, masalan, agar statik maydon toifadagi o'zgaruvchi bo'lsa int, seriyadan chiqarilgandan keyin uning qiymati nolga teng bo'ladi, agar turi float0,0, agar turi Objectnull. Rostini aytsam, bu Java intervyularida serializatsiya bo'yicha eng ko'p beriladigan savollardan biridir. Ob'ekt haqidagi eng muhim ma'lumotlarni statik maydonda saqlamang!

  10. Va nihoyat, keling, bu haqda gaplashaylik static import. Ushbu modifikator standart operator bilan juda ko'p umumiy xususiyatlarga ega import, ammo undan farqli o'laroq, u sinfning bir yoki barcha statik a'zolarini import qilish imkonini beradi. Statik usullarni import qilishda ularga xuddi shu sinfda aniqlangandek kirish mumkin, xuddi shunday maydonlarni import qilishda biz ularga sinf nomini ko'rsatmasdan kirishimiz mumkin. Bu xususiyat Java 1.5 versiyasida joriy qilingan va to'g'ri foydalanilganda kodning o'qilishi yaxshilanadi. Ushbu qurilish ko'pincha JUnit testlarida topiladi , chunki Deyarli barcha test ishlab chiquvchilari static import, masalan, assert usullaridan assertEquals()va ularning ortiqcha yuklangan dublikatlaridan foydalanadilar. Hech narsa aniq bo'lmasa, qo'shimcha ma'lumot uchun xush kelibsiz .

Ana xolos. Har bir dasturchi Java'dagi statik modifikator haqida yuqoridagi barcha fikrlarni bilishi kerak . Ushbu maqola statik o'zgaruvchilar, maydonlar, usullar, ishga tushirish bloklari va importlar haqida asosiy ma'lumotlarni qamrab oldi. Java-da dasturlarni yozish va tushunishda bilish juda muhim bo'lgan ba'zi muhim xususiyatlarni o'z ichiga oladi. Umid qilamanki, har bir ishlab chiquvchi statik tushunchalardan foydalanish bo'yicha o'z ko'nikmalarini mukammallashtiradi, chunki ... Bu jiddiy dasturlash uchun juda muhim”.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION