JavaRush /Java блогу /Random-KY /Java'дагы статикалык өзгөрткүч боюнча 10 эскертүү

Java'дагы статикалык өзгөрткүч боюнча 10 эскертүү

Группада жарыяланган
Javaдагы статикалык өзгөрткүч түздөн-түз класс менен байланышкан. Эгерде талаа статикалык болсо, анда ал класска таандык, эгер метод статикалык болсо, ал бирдей: класска таандык. Мунун негизинде класстын атын колдонуу менен статикалык ыкмага же талаага кире аласыз. Мисалы, Counter классында эсептөө талаасы статикалык болсо, анда сиз өзгөрмөгө төмөнкүдөй суроо менен кире аласыз: Counter.count. 10 Javaдагы статикалык өзгөрткүч боюнча эскертүүлөр - 1Эскертүүлөрдү баштоодон мурун, келгиле, эстеп көрөлү (жана балким бorп алалы) эмне статика жана 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 консолго чыгат:

Orange car - 85
Blue car - 85
Анткени, бизде бардыгыбыз үчүн бир өзгөрмө бар жана биз аны өзгөрткөн сайын. Статикалык өзгөрмөлөргө адатта an object шилтемеси - 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дагы статикалык класс

Ички класс гана статикалык класс боло алат. Кайрадан бул класс сырткы класска байланган, эгерде сырткы класс башка класска тукум кууса, анда бул класс тукум кууbyte. Мындан тышкары, бул класс башка класстардан мурасталып, интерфейсти ишке ашыра тургандай эле, тукум кууса болот. Негизи, статикалык уяланган класс башка ички класстардан эч айырмаланbyte, анын 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ктүү. Талаалар пакеттин ( пакет ) ичиндеги бардык класстар үчүн, ошондой эле пакеттен тышкары бардык тукум класстар үчүн protectedжеткorктүү . Көбүрөөк маалымат алуу үчүн " жеке vs корголгон vs коомдук " макаласын караңыз . Класста статикалык метод бар дейли, анын милдети эсептегичти көбөйтүү . Бул ыкманы чакыруу үчүн форманы чакырууну колдонсоңуз болот . Статикалык талаага же методго жетүү үчүн классты түзүүнүн кереги жок . Бул статикалык жана статикалык эмес an objectилердин (класс мүчөлөрүнүн) ортосундагы негизги айырма. Дагы бир жолу эскертип кетейин, класстын статикалык мүчөлөрү класска эмес, түздөн-түз тиешелүү. Башкача айтканда, статикалык өзгөрмөнүн мааниси түрдөгү бардык an objectтер үчүн бирдей болот . Кийинчерээк бул макалада биз Javaдагы статикалык модификаторду колдонуунун негизги аспектилерин, ошондой эле негизги программалоо түшүнүктөрүн түшүнүүгө жардам бере турган айрым функцияларды карап чыгабыз. increment()CountercountCounter.increment()CountercountCounter

Ар бир программист Javaдагы Static өзгөрткүч жөнүндө эмнени бorши керек

Бул бөлүмдө биз статикалык ыкмаларды, талааларды жана класстарды колдонуунун негиздерин карап чыгабыз. Өзгөрмөлөрдөн баштайлы.
  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. Жергorктүү өзгөрмөлөрдөн айырмаланып, Java'да статикалык талаалар жана методдор жиптен КООПСУЗ ЭМЕС. Иш жүзүндө, бул көп агымдуу программалоонун коопсуздугуна байланыштуу көйгөйлөрдүн эң көп таралган себептеринин бири. Класстын ар бир инстанциясында статикалык өзгөрмөнүн бирдей көчүрмөсү бар экенин эске алып, мындай өзгөрмө корголушу керек — класс тарабынан “кулпуланган”. Ошондуктан, статикалык өзгөрмөлөрдү колдонуп жатканда, жарыш шарттары сыяктуу көйгөйлөрдү болтурбоо үчүн, алардын туура синхрондоштуруусун текшериңиз.

  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. Во время сериализации, также How и transient переменные, статические поля не сериализуются. Действительно, если сохранить любые данные в статическом поле, то после десериализации новый an object будет содержать его первичное (по-умолчанию) meaning, например, если статическим полем была переменная типа int, то её meaning после десериализации будет равно нулю, если типа float – 0.0, если типа Objectnull. Честно говоря, это один из наиболее часто задаваемых вопросов касательно сериализации на собеседованиях по Java. Не храните наиболее важные данные об an objectе в статическом поле!

  10. Анан, акыры, жөнүндө сүйлөшөлү static import. Бул модификатор стандарт оператор менен көп окшоштуктарга ээ import, бирок андан айырмаланып, класстын бир же бардык статикалык мүчөлөрүн импорттоого мүмкүндүк берет. Статикалык ыкмаларды импорттоодо, алар ошол эле класста аныкталгандай, талааларды импорттоодо, класстын атын көрсөтпөстөн эле кире алабыз. Бул өзгөчөлүк Java 1.5 versionсында киргизилген жана туура колдонулганда codeдун окулушун жакшыртат. Бул курулуш көбүнчө JUnit тесттеринде кездешет , анткени Дээрлик бардык тест иштеп чыгуучулар static importassert ыкмаларын колдонушат, мисалы, assertEquals()жана алардын ашыкча жүктөлгөн дубликаттары. Эгер эч нерсе так болбосо, кошумча маалымат алуу үчүн кош келиңиз .

Баары болду. Ар бир программист Javaдагы статикалык модификатор жөнүндө жогорудагы пункттардын баарын бorши керек . Бул макалада статикалык өзгөрмөлөр, талаалар, ыкмалар, инициализациялоо блоктору жана импорт жөнүндө негизги маалымат камтылган. Java тorнде программаларды жазууда жана түшүнүүдө маанилүү болгон кээ бир маанилүү касиеттерди камтыйт. Ар бир иштеп чыгуучу статикалык түшүнүктөрдү колдонууда өз жөндөмүн өркүндөтөт деп үмүттөнөм, анткени... Бул олуттуу программалоо үчүн абдан маанилүү."
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION