JavaRush /Java блогы /Random-KK /10 Java тіліндегі статикалық модификатор туралы ескертпел...

10 Java тіліндегі статикалық модификатор туралы ескертпелер

Топта жарияланған
Java тіліндегі статикалық модификатор класспен тікелей байланысты. Егер өріс статикалық болса, онда ол сыныпқа жатады, егер әдіс статикалық болса, ол бірдей: сыныпқа жатады. Осының негізінде класс атын пайдаланып статикалық әдіске немесе өріске қол жеткізуге болады. Мысалы, егер санау өрісі Counter сыныбында статикалық болса, айнымалыға келесідей сұрау арқылы қол жеткізуге болады: Counter.count. 10 Java тіліндегі статикалық модификатор туралы ескертпелер - 1Жазбаларды бастамас бұрын, Java-да статикалық деген не екенін және ненің статикалық болуы мүмкін екенін еске түсіріп алайық (және бәлкім білейік). Static – өріске, блокқа, әдіске немесе ішкі сыныпқа қолданылатын модификатор. Бұл модификатор тақырыптың ағымдағы сыныпқа байланысты екенін көрсетеді.

Статикалық өрістер

Класс деңгейіндегі айнымалыны белгілегенде, мәннің сыныпқа жататынын көрсетеміз. Егер мұны жасамасаңыз, онда айнымалының мәні осы сыныпты пайдаланып жасалған нысанға байланыстырылады. Бұл нені білдіреді? 10 Java-дағы статикалық модификатор туралы ескертпелер - 2Ал егер айнымалы статикалық болмаса, онда осы класстың әрбір жаңа нысаны осы айнымалының өзіндік мәніне ие болады, оны өзгерту арқылы біз оны тек бір 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тағы бірдей code консольге шығады:

Orange car - 85
Blue car - 85
Өйткені, бізде бәріміз үшін бір айнымалы бар және біз оны өзгерткен сайын. Статикалық айнымалыларға әдетте нысан сілтемесі – orangeCar.km арқылы емес, класс аты – Car.km арқылы қатынасады.

Статикалық блок

Екі инициализация блогы бар - тұрақты және статикалық. Блок ішкі айнымалыларды инициализациялауға арналған. Егер блок қалыпты болса, онда 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 тіліндегі статикалық класс

Тек ішкі класс статикалық класс бола алады. Қайтадан, бұл класс сыртқы сыныпқа байланған, ал егер сыртқы класс басқа классқа мұрагер болса, онда бұл тұқым қуаламайды. Сонымен қатар, бұл сыныпты мұраға алуға болады, ол кез келген басқа сыныптан мұраға алынуы және интерфейсті жүзеге асыруы мүмкін. Негізінде, статикалық кірістірілген класс кез келген басқа ішкі сыныптан айырмашылығы жоқ, тек оның нысанында оны жасаған сыртқы сынып нысанына сілтеме жоқ. Дегенмен, бұл статикалық классты кәдімгі кірістірілмеген класқа барынша ұқсас етеді, себебі жалғыз айырмашылық оның басқа сыныпқа оралғанында. Кейбір жағдайларда бұл біз үшін артықшылық, өйткені оның көмегімен біз сыртқы сыныптың жеке статикалық айнымалыларына қол жеткізе аламыз. Кірістірілген статикалық сыныптың мысалы:
public class Vehicle {

  public static class Car {
     public int km;
  }
}
Осы сыныптың данасын жасау және ішкі айнымалының мәнін орнату:
Vehicle.Car car = new Vehicle.Car();
car.km = 90;
Статикалық әдістерді/айнымалыларды/сыныпты пайдалану үшін бізге сол сыныптың an objectісін жасаудың қажеті жоқ. Әрине, кіру модификаторларын ескеру қажет. Мысалы, өрістерге privateолар жарияланған сынып ішінде ғана қол жетімді. Өрістер бума ( бума ) ішіндегі барлық сыныптар үшін, сонымен қатар бумадан тыс барлық мұра алатын сыныптар үшін protectedқолжетімді . Қосымша мәліметтер алу үшін « жеке және қорғалған және жалпыға ортақ » мақаласын қараңыз . Сыныпта есептегішті ұлғайту болып табылатын статикалық әдіс бар делік . Бұл әдісті шақыру үшін пішінді шақыруды пайдалануға болады . Статикалық өріске немесе әдіске қол жеткізу үшін сыныпты құрудың қажеті жоқ . Бұл статикалық және статикалық емес нысандар (сынып мүшелері) арасындағы негізгі айырмашылық. Тағы бір рет еске сала кетейін, статикалық класс мүшелері оның данасына емес, тікелей класқа жатады. Яғни, статикалық айнымалының мәні түрдегі барлық нысандар үшін бірдей болады . Кейінірек осы мақалада біз Java тіліндегі статикалық модификаторды пайдаланудың негізгі аспектілерін, сондай-ақ негізгі бағдарламалау тұжырымдамаларын түсінуге көмектесетін кейбір мүмкіндіктерді қарастырамыз. increment()CountercountCounter.increment()CountercountCounter

Әрбір бағдарламашы Java тіліндегі статикалық модификатор туралы не білуі керек

Бұл бөлімде біз статикалық әдістерді, өрістерді және сыныптарды пайдалану негіздерін қарастырамыз. Айнымалылардан бастайық.
  1. Әдіс немесе блок сияқты статикалық контексте сыныптың статикалық емес мүшелеріне қол жеткізе алмайсыз. Төмендегі codeты құрастыру қатеге әкеледі:

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

    Бұл Java бағдарламашыларының, әсіресе жаңадан бастағандардың жиі жіберетін қателерінің бірі. Әдіс mainстатикалық болғандықтан, бірақ айнымалы countемес, бұл жағдайда әдіс printlnішіндегі әдіс 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, статикалық өрістер серияланбайды. Шынында да, егер сіз кез келген деректерді статикалық өрісте сақтасаңыз, сериясыздандырудан кейін жаңа нысан өзінің бастапқы (әдепкі) мәнін қамтиды, мысалы, егер статикалық өріс түрдегі айнымалы болса int, сериясыздандырудан кейінгі оның мәні нөлге тең болады, егер түрі float0,0, егер түрі Objectnull. Шынымды айтсам, бұл Java сұхбаттарында сериализацияға қатысты ең жиі қойылатын сұрақтардың бірі. Нысан туралы ең маңызды деректерді статикалық өрісте сақтамаңыз!

  10. Және, ең соңында, туралы сөйлесейік static import. Бұл модификатордың стандартты операторымен көп ұқсастықтары бар import, бірақ одан айырмашылығы ол сыныптың бір немесе барлық статикалық мүшелерін импорттауға мүмкіндік береді. Статикалық әдістерді импорттау кезінде оларға бір сыныпта анықталғандай қол жеткізуге болады, өрістерді импорттау кезінде де біз оларға сынып атын көрсетпей қол жеткізе аламыз. Бұл мүмкіндік Java 1.5 нұсқасында енгізілген және дұрыс пайдаланылған кезде codeтың оқылуын жақсартады. Бұл конструкция көбінесе JUnit сынақтарында кездеседі , себебі Барлық дерлік сынақ әзірлеушілері static import, мысалы, бекіту әдістерін assertEquals()және олардың шамадан тыс жүктелген көшірмелерін пайдаланады. Егер ештеңе анық болмаса, қосымша ақпарат алу үшін қош келдіңіз .

Бар болғаны. Әрбір бағдарламашы Java тіліндегі статикалық модификатор туралы жоғарыда аталған барлық тармақтарды білуі керек . Бұл мақала статикалық айнымалылар, өрістер, әдістер, инициализация блоктары және импорттар туралы негізгі ақпаратты қамтыды. Java тілінде бағдарламаларды жазу және түсіну кезінде маңызды болып табылатын кейбір маңызды қасиеттерді қамтиды. Әрбір әзірлеуші ​​​​статикалық тұжырымдамаларды пайдалану дағдыларын жетілдіреді деп үміттенемін, өйткені ... Бұл маңызды бағдарламалау үшін өте маңызды ».
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION