JavaRush /Blog Java /Random-MS /10 Nota mengenai Pengubahsuai Statik di Jawa

10 Nota mengenai Pengubahsuai Statik di Jawa

Diterbitkan dalam kumpulan
Pengubah suai statik di Java dikaitkan secara langsung dengan kelas. Jika medan statik, maka ia tergolong dalam kelas, jika kaedah statik, ia adalah sama: ia tergolong dalam kelas. Berdasarkan ini, anda boleh mengakses kaedah atau medan statik menggunakan nama kelas. Contohnya, jika medan kiraan adalah statik dalam kelas Kaunter, maka anda boleh mengakses pembolehubah dengan pertanyaan seperti: Counter.count. 10 Nota mengenai Pengubahsuai Statik di Java - 1Sebelum kita mulakan dengan nota, mari kita ingat (dan mungkin mengetahui) apa itu statik dan apa yang boleh statik dalam Java. Statik ialah pengubah suai yang digunakan pada medan, blok, kaedah atau kelas dalam. Pengubah suai ini menunjukkan bahawa subjek terikat kepada kelas semasa.

Medan statik

Apabila kita menandakan pembolehubah peringkat kelas, kita menunjukkan bahawa nilai itu tergolong dalam kelas. Jika anda tidak melakukan ini, maka nilai pembolehubah akan terikat pada objek yang dibuat menggunakan kelas ini. Apakah maksudnya? 10 Nota mengenai Pengubahsuai Statik di Java - 2Dan hakikatnya ialah jika pembolehubah itu tidak statik, maka setiap objek baharu kelas ini akan mempunyai nilai tersendiri bagi pembolehubah ini, dengan menukar yang kita ubah secara eksklusif dalam satu objek: Sebagai contoh, kita mempunyai kelas Kereta dengan bukan -pembolehubah statik:
public class Car {
  int km;
}
Kemudian dalam utama:
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);
Output yang kami dapat ialah:

Orange car - 100
Blue car - 85
Seperti yang anda lihat, setiap objek mempunyai pembolehubah sendiri, perubahan yang berlaku hanya untuk objek ini. Nah, jika kita mempunyai pembolehubah statik, maka nilai global ini adalah sama untuk semua orang: Sekarang kita mempunyai Kereta dengan pembolehubah statik:
public class Car {
  static int km;
}
Kemudian kod yang sama dalam utama akan dikeluarkan ke konsol:

Orange car - 85
Blue car - 85
Lagipun, kita mempunyai satu pembolehubah untuk kita semua, dan setiap kali kita mengubahnya. Pembolehubah statik biasanya tidak diakses oleh rujukan objek - orangeCar.km, tetapi dengan nama kelas - Car.km

Blok statik

Terdapat dua blok permulaan - biasa dan statik. Blok ini bertujuan untuk memulakan pembolehubah dalaman. Jika blok itu normal, maka pembolehubah dalaman objek dimulakan dengannya, tetapi jika ia statik, maka pembolehubah statik (iaitu pembolehubah kelas) diberikan kepada mereka. Contoh kelas dengan blok permulaan statik:
public class Car {
  static int km;

  static {
     km = 150;
  }
}

Kaedah statik

Kaedah statik berbeza daripada kaedah biasa kerana ia juga terikat kepada kelas dan bukannya objek. Sifat penting kaedah statik ialah ia hanya boleh mengakses pembolehubah/kaedah statik. Sebagai contoh, mari kita lihat kelas yang akan menjadi sejenis kaunter yang menjejaki panggilan kaedah:
public class Counter {
  static int count;

  public static void invokeCounter() {
     count++;
     System.out.println("Current counter value - " + count);
  }
}
Mari kita panggil ia dalam utama:
Counter.invokeCounter();
Counter.invokeCounter();
Counter.invokeCounter();
Dan kami mendapat output ke konsol:

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

Kelas statik di Jawa

Hanya kelas dalaman boleh menjadi kelas statik. Sekali lagi, kelas ini terikat dengan kelas luar, dan jika kelas luar diwarisi oleh kelas lain, maka kelas ini tidak akan diwarisi. Selain itu, kelas ini boleh diwarisi, sama seperti ia boleh diwarisi daripada mana-mana kelas lain dan melaksanakan antara muka. Pada asasnya, kelas bersarang statik tidak berbeza daripada kelas dalam yang lain, kecuali objeknya tidak mengandungi rujukan kepada objek kelas luar yang menciptanya. Walau bagaimanapun, ini menjadikan kelas statik paling serupa dengan kelas biasa yang tidak bersarang, kerana satu-satunya perbezaan ialah ia dibungkus dalam kelas lain. Dalam sesetengah kes, ini adalah kelebihan untuk kami, kerana daripadanya kami mempunyai akses kepada pembolehubah statik persendirian kelas luar. Contoh kelas statik bersarang:
public class Vehicle {

  public static class Car {
     public int km;
  }
}
Mencipta contoh kelas ini dan menetapkan nilai pembolehubah dalaman:
Vehicle.Car car = new Vehicle.Car();
car.km = 90;
Untuk menggunakan kaedah/pembolehubah/kelas statik, kita tidak perlu mencipta objek kelas tersebut. Sudah tentu, pengubah suai akses perlu diambil kira. Sebagai contoh, medan privatehanya boleh diakses dalam kelas di mana ia diisytiharkan. Medan protectedtersedia untuk semua kelas di dalam pakej ( pakej ), serta kepada semua kelas pewarisan di luar pakej. Untuk butiran lanjut, lihat artikel " peribadi vs dilindungi vs awam ". Katakan terdapat kaedah statik increment()dalam kelas Counteryang tugasnya adalah untuk menambah pembilang count. Untuk memanggil kaedah ini, anda boleh menggunakan permohonan borang Counter.increment(). Tidak perlu membuat instantiate kelas Counteruntuk mengakses medan atau kaedah statik. Ini ialah perbezaan asas antara objek statik dan BUKAN statik (ahli kelas). Biar saya ingatkan anda sekali lagi bahawa ahli kelas statik secara langsung tergolong dalam kelas, bukan contohnya. Iaitu, nilai pembolehubah statik countakan sama untuk semua objek jenis Counter. Kemudian dalam artikel ini, kita akan melihat aspek asas menggunakan pengubah suai statik dalam Java, serta beberapa ciri yang akan membantu anda memahami konsep pengaturcaraan utama.

Perkara yang perlu diketahui oleh setiap pengaturcara tentang pengubah suai Statik di Java

Dalam bahagian ini, kita akan melihat asas penggunaan kaedah statik, medan dan kelas. Mari kita mulakan dengan pembolehubah.
  1. Anda TIDAK boleh mengakses ahli kelas bukan statik dalam konteks statik, seperti kaedah atau blok. Menyusun kod di bawah akan mengakibatkan ralat:

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

    Ini adalah salah satu kesilapan yang paling biasa dilakukan oleh pengaturcara Java, terutamanya pemula. Oleh kerana kaedah mainadalah statik, tetapi pembolehubahnya counttidak, dalam kes ini kaedah printlndi dalam kaedah mainakan membuang "Ralat masa kompilasi".

  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. Semasa bersiri, sama seperti transientpembolehubah, medan statik tidak bersiri. Sesungguhnya, jika anda menyimpan sebarang data dalam medan statik, maka selepas penyahserikatan objek baharu akan mengandungi nilai utamanya (lalai), contohnya, jika medan statik ialah pembolehubah jenis int, maka nilainya selepas penyahserikatan akan menjadi sifar, jika jenisnya floatialah 0.0, jika jenis Objectnull. Secara jujur, ini adalah salah satu soalan yang paling kerap ditanya mengenai serialisasi dalam wawancara Java. Jangan simpan data paling penting tentang objek dalam medan statik!

  10. Dan akhirnya, mari kita bercakap tentang static import. Pengubah suai ini mempunyai banyak persamaan dengan operator standard import, tetapi tidak seperti itu, ia membenarkan anda mengimport satu atau semua ahli statik kelas. Apabila mengimport kaedah statik, kaedah tersebut boleh diakses seolah-olah ia ditakrifkan dalam kelas yang sama, begitu juga apabila mengimport medan, kita boleh mengaksesnya tanpa menyatakan nama kelas. Ciri ini telah diperkenalkan dalam Java versi 1.5, dan apabila digunakan dengan betul, meningkatkan kebolehbacaan kod. Pembinaan ini paling kerap ditemui dalam ujian JUnit , kerana Hampir semua pembangun ujian menggunakan static importkaedah penegasan, contohnya, assertEquals()dan pendua mereka yang terlebih muatan. Jika tiada yang jelas, dialu-alukan untuk mendapatkan maklumat tambahan .

Itu sahaja. Setiap pengaturcara mesti mengetahui semua perkara di atas tentang pengubah suai statik dalam Java . Artikel ini merangkumi maklumat asas tentang pembolehubah statik, medan, kaedah, blok permulaan dan import. Termasuk beberapa sifat penting, pengetahuan yang penting semasa menulis dan memahami program di Jawa. Saya berharap setiap pembangun akan menyempurnakan kemahiran mereka dalam menggunakan konsep statik kerana... Ini sangat penting untuk pengaturcaraan yang serius."
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION