Bahasa Java menyediakan banyak pengubah, yang sebagian besar dibagi menjadi dua kategori berikut:
Pengubah digunakan untuk mendefinisikan kelas, metode atau variabel, dan biasanya ditempatkan di depan pernyataan. Kami mengilustrasikannya melalui 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) { // 方法体}
Di Java, kontrol akses dapat digunakan untuk melindungi akses ke kelas, variabel, metode, dan konstruktor. Java mendukung 4 hak akses yang berbeda.
Defaultnya, juga disebut default, terlihat dalam paket yang sama dan tidak menggunakan pengubah apa pun.
Pribadi, ditentukan dengan pengubah pribadi, terlihat dalam kelas yang sama.
Publik, ditentukan dengan pengubah publik, dapat dilihat oleh semua kelas.
Dilindungi, ditentukan dengan pengubah yang dilindungi, terlihat oleh kelas dan semua subkelas dalam paket yang sama.
Variabel dan metode yang dideklarasikan dengan pengubah akses default dapat dilihat oleh kelas-kelas dalam paket yang sama. Variabel dalam antarmuka secara implisit dideklarasikan sebagai public static final
, sedangkan metode dalam antarmuka memiliki izin akses public
secara default.
Contoh:
Seperti yang ditunjukkan pada contoh berikut, variabel dan metode dapat dideklarasikan tanpa pengubah apa pun.
String version = "1.5.1"; boolean processOrder() { return true; }
Pengubah akses privat adalah tingkat akses yang paling ketat, sehingga metode, variabel, dan konstruktor yang dideklarasikan sebagai privat hanya dapat diakses oleh kelas miliknya, dan kelas serta antarmuka tidak dapat dideklarasikan sebagai privat.
Variabel yang dideklarasikan sebagai tipe akses privat hanya dapat diakses oleh kelas eksternal melalui metode pengambil publik di kelas tersebut.
Penggunaan pengubah akses Pribadi terutama digunakan untuk menyembunyikan detail implementasi kelas dan melindungi data kelas.
Kelas berikut menggunakan pengubah akses privat:
public class Logger { private String format; public String getFormat() { return this.format; } public void setFormat(String format) { this.format = format; } }
Pada contoh, variabel format pada kelas Logger merupakan variabel privat, sehingga kelas lain tidak bisa langsung mendapatkan dan mengatur nilai variabel tersebut. Untuk mengaktifkan kelas lain untuk mengoperasikan variabel ini, dua metode public
didefinisikan: getFormat()
(mengembalikan nilai format) dan setFormat(String)
(mengatur nilai format)
Kelas, metode, konstruktor, dan antarmuka yang dideklarasikan sebagai publik dapat diakses oleh kelas lain mana pun.
Jika beberapa kelas publik yang saling mengakses didistribusikan dalam paket yang berbeda, Anda perlu mengimpor paket tempat kelas publik terkait berada. Karena pewarisan kelas, semua metode dan variabel publik suatu kelas dapat diwarisi oleh subkelasnya.
Fungsi berikut menggunakan kontrol akses publik:
public static void main(String[] arguments) { // ... }
Metode main() program Java harus disetel ke publik, jika tidak, juru bahasa Java tidak akan dapat menjalankan kelas.
Variabel, metode, dan konstruktor yang dideklarasikan sebagai terproteksi dapat diakses oleh kelas lain dalam paket yang sama, atau oleh subkelas dalam paket berbeda.
Pengubah akses yang dilindungi tidak dapat mengubah kelas dan antarmuka. Metode dan variabel anggota dapat dinyatakan dilindungi, tetapi variabel anggota dan metode anggota antarmuka tidak dapat dinyatakan dilindungi.
Subkelas dapat mengakses metode dan variabel yang dideklarasikan dengan pengubah Dilindungi, sehingga melindungi kelas yang tidak terkait agar tidak menggunakan metode dan variabel ini.
Kelas induk berikut menggunakan pengubah akses yang dilindungi, dan subkelasnya mengambil alih metode openSpeaker() kelas induk.
class AudioPlayer { protected boolean openSpeaker(Speaker sp) { // 实现细节} } class StreamingAudioPlayer extends AudioPlayer { boolean openSpeaker(Speaker sp) { // 实现细节} }
Jika metode openSpeaker() dinyatakan pribadi, kelas selain AudioPlayer tidak akan dapat mengakses metode ini.
Jika openSpeaker() dideklarasikan sebagai publik, semua kelas dapat mengakses metode ini.
Jika kita hanya ingin metode tersebut terlihat oleh subkelas dari kelasnya, nyatakan metode tersebut sebagai dilindungi.
Harap perhatikan aturan berikut untuk pewarisan metode:
Metode yang dideklarasikan sebagai publik di kelas induk juga harus bersifat publik di kelas anak.
Metode yang dinyatakan dilindungi di kelas induk akan dinyatakan dilindungi atau publik di subkelasnya. Tidak dapat dinyatakan pribadi.
Metode yang dideklarasikan sebagai privat di kelas induk tidak dapat diwariskan.
Untuk mengimplementasikan beberapa fungsi lainnya, Java juga menyediakan banyak pengubah non-akses.
pengubah statis, digunakan untuk membuat metode kelas dan variabel kelas.
Pengubah final digunakan untuk memodifikasi kelas, metode, dan variabel. Kelas yang dimodifikasi oleh final tidak dapat diwariskan, metode yang dimodifikasi tidak dapat didefinisikan ulang oleh kelas yang diwarisi, dan variabel yang dimodifikasi adalah konstanta dan tidak dapat dimodifikasi.
pengubah abstrak, digunakan untuk membuat kelas abstrak dan metode abstrak.
Pengubah tersinkronisasi dan volatil terutama digunakan untuk pemrograman thread.
Variabel statis:
Kata kunci static digunakan untuk mendeklarasikan variabel statis yang independen terhadap objek. Tidak peduli berapa banyak objek yang dibuat oleh suatu kelas, hanya ada satu salinan dari variabel statisnya. Variabel statis juga dikenal sebagai variabel kelas. Variabel lokal tidak dapat dideklarasikan sebagai variabel statis.
Metode statis:
Kata kunci static digunakan untuk mendeklarasikan metode statis yang tidak bergantung pada objek. Metode statis tidak dapat menggunakan variabel kelas non-statis. Metode statis mengambil data dari daftar parameter dan kemudian menghitung datanya.
Akses terhadap variabel dan metode kelas dapat langsung diakses menggunakan classname.variablename
dan classname.methodname
.
Seperti yang ditunjukkan pada contoh berikut, pengubah statis digunakan untuk membuat metode kelas dan variabel 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"); } }
Hasil editing dari menjalankan contoh di atas adalah sebagai berikut:
Started with 0 instances Created 500 instances
variabel akhir:
Variabel akhir dapat diinisialisasi secara eksplisit dan hanya sekali. Referensi pada objek yang dinyatakan final tidak boleh menunjuk ke objek yang berbeda. Namun data pada objek akhir dapat diubah. Dengan kata lain, referensi dari objek akhir tidak dapat diubah, tetapi nilai di dalamnya dapat diubah.
Pengubah terakhir sering digunakan bersama dengan pengubah statis untuk membuat konstanta kelas.
Contoh:
public class Test{ final int value = 10; // 下面是声明常量的实例public static final int BOXWIDTH = 6; static final String TITLE = "Manager"; public void changeValue(){ value = 12; //将输出一个错误} }
Metode Final di suatu kelas dapat diwarisi oleh subkelas, namun tidak dapat dimodifikasi oleh subkelas.
Tujuan utama mendeklarasikan metode final adalah untuk mencegah isi metode diubah.
Seperti yang ditunjukkan di bawah ini, deklarasikan metode menggunakan pengubah final.
public class Test{ public final void changeName(){ // 方法体} }
Kelas final tidak dapat diwariskan, dan tidak ada kelas yang dapat mewarisi karakteristik apa pun dari kelas final.
Contoh:
public final class Test { // 类体}
Kelas abstrak:
Kelas abstrak tidak dapat digunakan untuk membuat instance objek. Satu-satunya tujuan mendeklarasikan kelas abstrak adalah untuk memperluas kelas tersebut di masa mendatang.
Sebuah kelas tidak dapat dimodifikasi secara abstrak dan final secara bersamaan. Jika suatu kelas berisi metode abstrak, kelas tersebut harus dideklarasikan sebagai kelas abstrak, jika tidak maka akan terjadi kesalahan kompilasi.
Kelas abstrak dapat berisi metode abstrak dan metode non-abstrak.
Contoh:
abstract class Caravan{ private double price; private String model; private String year; public abstract void goFast(); //抽象方法public abstract void changeColor(); }
Metode abstrak adalah metode tanpa implementasi apa pun. Implementasi spesifik dari metode ini disediakan oleh subkelas. Metode abstrak tidak dapat dinyatakan final dan statis.
Setiap subkelas yang mewarisi kelas abstrak harus mengimplementasikan semua metode abstrak dari kelas induk, kecuali subkelas tersebut juga merupakan kelas abstrak.
Jika suatu kelas berisi beberapa metode abstrak, maka kelas tersebut harus dideklarasikan sebagai kelas abstrak. Kelas abstrak tidak perlu berisi metode abstrak.
Deklarasi metode abstrak diakhiri dengan titik koma, misalnya: public abstract sample();
Contoh:
public abstract class SuperClass{ abstract void m(); //抽象方法} class SubClass extends SuperClass{ //实现抽象方法void m(){ ......... } }
Metode yang dideklarasikan dengan kata kunci tersinkronisasi hanya dapat diakses oleh satu thread pada waktu yang bersamaan. Pengubah Tersinkronisasi dapat diterapkan ke empat pengubah akses.
Contoh:
public synchronized void showDetails(){ ....... }
Ketika objek serial berisi variabel instan yang dimodifikasi secara sementara, Java Virtual Machine (JVM) melewatkan variabel tersebut.
Pengubah ini disertakan dalam pernyataan yang mendefinisikan variabel dan digunakan untuk melakukan praproses tipe data kelas dan variabel.
Contoh:
public transient int limit = 55; // will not persist public int b; // will persist
Setiap kali variabel anggota yang dimodifikasi volatil diakses oleh thread, nilai variabel anggota dipaksa untuk dibaca ulang dari memori bersama. Selain itu, ketika variabel anggota berubah, thread dipaksa untuk menulis nilai yang diubah kembali ke memori bersama. Dengan cara ini, setiap saat, dua thread berbeda selalu melihat nilai variabel anggota yang sama.
Referensi objek yang mudah menguap mungkin bernilai nol.
Contoh:
public class MyRunnable implements Runnable { private volatile boolean active; public void run() { active = true; while (active) // line 1 { // 代码} } public void stop() { active = false; // line 2 } }
Umumnya, metode run() dipanggil di satu thread dan metode stop() dipanggil di thread lain. Jika nilai aktif pada baris 1 di buffer digunakan, maka perulangan tidak akan berhenti ketika aktif pada baris 2 disetel ke false.