Pengubah suai Java


Bahasa Java menyediakan banyak pengubah suai, yang terutamanya dibahagikan kepada dua kategori berikut:

  • Pengubah suai akses

  • Bukan -access Modifiers

modifiers digunakan untuk menentukan kelas, kaedah atau pembolehubah, dan biasanya diletakkan di hadapan pernyataan. Kami menggambarkan dengan contoh berikut:

public class className {
   // ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
   // 方法体
}

Pengubah suai kawalan akses

Dalam Java, pengubah kawalan akses boleh digunakan untuk melindungi akses kepada kelas, pembolehubah, kaedah dan pembina. Java menyokong 4 hak akses yang berbeza.

Lalai, juga dipanggil lalai, kelihatan dalam pakej yang sama tanpa sebarang pengubah suai.

Persendirian, dinyatakan dengan pengubah suai peribadi, boleh dilihat dalam kelas yang sama.

Awam, dinyatakan dengan pengubah suai awam, kelihatan kepada semua kelas.

Dilindungi, dinyatakan dengan pengubah dilindungi, boleh dilihat oleh kelas dan semua subkelas dalam pakej yang sama.

Pengubah suai akses lalai - jangan gunakan sebarang kata kunci

Pembolehubah dan kaedah yang diisytiharkan menggunakan pengubah suai akses lalai boleh dilihat oleh kelas dalam pakej yang sama. Pembolehubah dalam antara muka secara tersirat diisytiharkan sebagai akhir statik awam, dan hak akses kaedah dalam antara muka adalah awam secara lalai.

Contoh:

Seperti yang ditunjukkan dalam contoh berikut, pembolehubah dan kaedah boleh diisytiharkan tanpa sebarang pengubah suai.

String version = "1.5.1";
boolean processOrder() {
   return true;
}

Pengubah suai akses persendirian

Pengubah suai akses persendirian ialah tahap capaian yang paling ketat, jadi kaedah, pembolehubah dan pembina yang diisytiharkan sebagai persendirian hanya boleh diakses oleh kelas di mana ia berada, dan Kelas dan antara muka tidak boleh diisytiharkan peribadi.

Pembolehubah yang diisytiharkan sebagai jenis akses peribadi hanya boleh diakses oleh kelas luaran melalui kaedah pengambil awam dalam kelas.

Penggunaan pengubah suai akses Peribadi digunakan terutamanya untuk menyembunyikan butiran pelaksanaan kelas dan melindungi data kelas.

Kelas berikut menggunakan pengubah akses peribadi:

public class Logger {
   private String format;
   public String getFormat() {
      return this.format;
   }
   public void setFormat(String format) {
      this.format = format;
   }
}

Dalam contoh, pembolehubah format dalam kelas Logger ialah pembolehubah peribadi, jadi kelas lain tidak boleh mendapatkan dan menetapkan nilai secara langsung pembolehubah. Untuk membolehkan kelas lain mengendalikan pembolehubah ini, dua kaedah awam ditakrifkan: getFormat() (mengembalikan nilai format) dan setFormat(String) (menetapkan nilai format)

Pengubah suai akses awam-awam

Kelas, kaedah, pembina dan antara muka yang diisytiharkan sebagai awam boleh diakses oleh mana-mana kelas lain.

Jika beberapa kelas awam yang mengakses satu sama lain diedarkan dalam pakej yang berbeza, anda perlu mengimport pakej di mana kelas awam yang sepadan terletak. Disebabkan oleh warisan kelas, semua kaedah awam dan pembolehubah kelas boleh diwarisi oleh subkelasnya.

Fungsi berikut menggunakan kawalan akses awam:

public static void main(String[] arguments) {
   // ...
}

Kaedah utama() program Java mesti ditetapkan kepada awam, jika tidak, penterjemah Java tidak akan dapat menjalankan kelas.

Pengubah suai akses yang dilindungi - dilindungi

Pembolehubah, kaedah dan pembina yang diisytiharkan sebagai dilindungi boleh diakses oleh mana-mana kelas lain dalam pakej yang sama, atau oleh kelas dalam akses subkelas pakej yang berbeza.

Pengubah suai akses yang dilindungi tidak boleh mengubah suai kelas dan antara muka Kaedah dan pembolehubah ahli boleh diisytiharkan sebagai dilindungi, tetapi pembolehubah ahli dan kaedah antara muka tidak boleh diisytiharkan sebagai dilindungi.

Subkelas boleh mengakses kaedah dan pembolehubah yang diisytiharkan dengan pengubah suai Dilindungi, dengan itu melindungi kelas yang tidak berkaitan daripada menggunakan kaedah dan pembolehubah ini.

Kelas induk berikut menggunakan pengubah suai akses dilindungi, dan subkelas melebihkan kaedah openSpeaker() kelas induk.

class AudioPlayer {
   protected boolean openSpeaker(Speaker sp) {
      // 实现细节
   }
}

class StreamingAudioPlayer {
   boolean openSpeaker(Speaker sp) {
      // 实现细节
   }
}

Jika kaedah openSpeaker() diisytiharkan sebagai peribadi, kelas selain AudioPlayer tidak akan dapat mengakses kaedah ini. Jika openSpeaker() diisytiharkan sebagai awam, semua kelas boleh mengakses kaedah ini. Jika kita hanya mahu kaedah itu kelihatan kepada subkelas kelasnya, isytiharkan kaedah itu sebagai dilindungi.

Kawalan dan Pewarisan Akses

Sila ambil perhatian peraturan berikut untuk pewarisan kaedah:

  • Kaedah yang diisytiharkan sebagai awam dalam kelas induk juga mesti terbuka dalam kelas kanak-kanak.

  • Kaedah yang diisytiharkan sebagai dilindungi dalam kelas induk sama ada diisytiharkan sebagai dilindungi atau awam dalam subkelas. Tidak boleh diisytiharkan peribadi.

  • Kaedah yang diisytiharkan sebagai peribadi dalam kelas induk tidak boleh diwarisi.


Pengubah suai bukan akses

Untuk melaksanakan beberapa fungsi lain, Java juga menyediakan banyak pengubah bukan akses.

pengubah suai statik, digunakan untuk mencipta kaedah kelas dan pembolehubah kelas.

Pengubah suai akhir digunakan untuk mengubah suai kelas, kaedah dan pembolehubah Kelas yang diubah suai oleh muktamad tidak boleh diwarisi, kaedah yang diubah suai tidak boleh ditakrifkan semula oleh kelas yang diwarisi dan pembolehubah yang diubah suai adalah pemalar dan tidak boleh diubah suai.

Pengubah suai abstrak, digunakan untuk mencipta kelas abstrak dan kaedah abstrak.

Pengubah suai disegerakkan dan tidak menentu digunakan terutamanya untuk pengaturcaraan benang.

Pengubah suai statik

  • Pembolehubah statik:

    Kata kunci statik digunakan untuk mengisytiharkan pembolehubah statik bebas daripada objek, tanpa mengira Tidak tidak kira berapa banyak objek yang digunakan oleh kelas, hanya terdapat satu salinan pembolehubah statiknya. Pembolehubah statik juga dipanggil pembolehubah kelas. Pembolehubah tempatan tidak boleh diisytiharkan sebagai pembolehubah statik.

  • Kaedah statik:

    Kata kunci Statik digunakan untuk mengisytiharkan kaedah statik bebas daripada objek. Kaedah statik tidak boleh menggunakan pembolehubah bukan statik kelas. Kaedah statik mendapatkan data daripada senarai parameter dan kemudian mengira data.

Akses kepada pembolehubah kelas dan kaedah boleh diakses terus menggunakan classname.variablename dan classname.methodname.

Seperti yang ditunjukkan dalam contoh berikut, pengubah suai statik digunakan untuk mencipta kaedah kelas dan pembolehubah kelas.

public class InstanceCounter {
   private static int numInstances = 0;
   protected static int getCount() {
      return numInstances;
   }

   private static void addInstance() {
      numInstances++;
   }

   InstanceCounter() {
      InstanceCounter.addInstance();
   }

   public static void main(String[] arguments) {
      System.out.println("Starting with " +
      InstanceCounter.getCount() + " instances");
      for (int i = 0; i < 500; ++i){
         new InstanceCounter();
          }
      System.out.println("Created " +
      InstanceCounter.getCount() + " instances");
   }
}

Contoh hasil larian dan penyuntingan di atas adalah seperti berikut:

Started with 0 instances
Created 500 instances

Pengubah suai akhir

Pembolehubah akhir:

Pembolehubah akhir boleh dipaparkan Dimulakan secara rasmi dan sekali sahaja. Rujukan kepada objek yang diisytiharkan muktamad tidak boleh menunjuk kepada objek yang berbeza. Tetapi data dalam objek akhir boleh diubah. Dengan kata lain, rujukan objek akhir tidak boleh diubah, tetapi nilai di dalamnya boleh diubah.

Pengubah suai akhir biasanya digunakan bersama-sama dengan pengubahsuai statik untuk mencipta pemalar kelas.

Instance:

public class Test{
  final int value = 10;
  // 下面是声明常量的实例
  public static final int BOXWIDTH = 6;
  static final String TITLE = "Manager";

  public void changeValue(){
     value = 12; //将输出一个错误
  }
}

Kaedah akhir

Kaedah Akhir dalam kelas boleh diwarisi oleh subkelas, tetapi tidak boleh diubah suai oleh subkelas.

Tujuan utama pengisytiharan kaedah muktamad adalah untuk mengelakkan kandungan kaedah daripada diubah suai.

Seperti yang ditunjukkan di bawah, gunakan pengubah suai terakhir untuk mengisytiharkan kaedah.

public class Test{
    public final void changeName(){
       // 方法体
    }
}

Kelas akhir

Kelas Akhir tidak boleh diwarisi dan tiada kelas boleh mewarisi sebarang ciri kelas akhir.

Instance:

public final class Test {
   // 类体
}

Pengubah suai abstrak

Kelas abstrak:

Kelas abstrak tidak boleh digunakan untuk membuat seketika objek, mengisytiharkan abstrak satu-satunya tujuan kelas adalah untuk memudahkan sambungan masa depan kepada kelas.

Sesuatu kelas tidak boleh diubah suai secara abstrak dan muktamad pada masa yang sama. Jika kelas mengandungi kaedah abstrak, kelas mesti diisytiharkan sebagai kelas abstrak, jika tidak ralat penyusunan akan berlaku.

Kelas abstrak boleh mengandungi kaedah abstrak dan kaedah bukan abstrak.

Instance:

abstract class Caravan{
   private double price;
   private String model;
   private String year;
   public abstract void goFast(); //抽象方法
   public abstract void changeColor();
}

Kaedah abstrak

Kaedah abstrak ialah kaedah tanpa sebarang pelaksanaan Perlaksanaan khusus kaedah disediakan oleh subkelas. Kaedah abstrak tidak boleh diisytiharkan muktamad dan ketat.

Mana-mana subkelas yang mewarisi kelas abstrak mesti melaksanakan semua kaedah abstrak kelas induk, melainkan subkelas itu juga kelas abstrak.

Jika kelas mengandungi beberapa kaedah abstrak, maka kelas itu mesti diisytiharkan sebagai kelas abstrak. Kelas abstrak tidak perlu mengandungi kaedah abstrak.

Pengisytiharan kaedah abstrak berakhir dengan koma bertitik, contohnya: sampel abstrak awam();

Contoh:

public abstract class SuperClass{
    abstract void m(); //抽象方法
}
 
class SubClass extends SuperClass{
     //实现抽象方法
      void m(){
          .........
      }
}

Pengubah suai disegerakkan

Disegerakkan kata kunci Kaedah yang diisytiharkan hanya boleh diakses oleh satu utas pada satu masa. Pengubah suai disegerakkan boleh digunakan pada empat pengubah akses.

Instance:

public synchronized void showDetails(){
.......
}

Pengubah suai sementara

Apabila objek bersiri mengandungi pembolehubah contoh yang diubah suai oleh sementara, Mesin Maya Java (JVM) melangkau pembolehubah tertentu itu.

Pengubah suai ini disertakan dalam pernyataan yang mentakrifkan pembolehubah dan digunakan untuk praproses jenis data kelas dan pembolehubah.

Contoh:

public transient int limit = 55;   // will not persist
public int b; // will persist

Pengubah suai meruap

Pembolehubah ahli diubah suai yang tidak menentu dipaksa untuk membaca semula daripada memori yang dikongsi setiap kali ia diakses oleh nilai urutan. Lebih-lebih lagi, apabila pembolehubah ahli berubah, benang terpaksa menulis nilai yang diubah kembali ke memori yang dikongsi. Dengan cara ini, pada bila-bila masa, dua utas berbeza sentiasa melihat nilai yang sama bagi pembolehubah ahli.

Rujukan objek yang tidak menentu mungkin batal.

Contoh:

public class MyRunnable implements Runnable
{
    private volatile boolean active;
    public void run()
    {
        active = true;
        while (active) // 第一行
        {
            // 代码
        }
    }
    public void stop()
    {
        active = false; // 第二行
    }
}

Biasanya, kaedah run() dipanggil pada satu thread (benang yang dimulakan oleh Runnable), dan kaedah stop() dipanggil pada thread lain. Jika nilai aktif penimbal dalam baris pertama daripada digunakan, maka gelung tidak akan gelung apabila nilai aktif baris kedua daripada adalah palsu.

Tetapi dalam kod di atas kami menggunakan volatile untuk mengubah suai aktif, jadi gelung akan berhenti.