Akses modifier adalah salah satu keyword yang akan kita tambahkan pada setiap deklarasi dari class.
Java menyediakan sejumlah akses modifier untuk mengatur tingkat akses untuk kelas, variabel, metode, dan konstruktor. Keempat tingkat akses adalah :
- default
- public
- private
- protected
contoh
public class className {
// ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
// body of method
}
Default Access Modifier - No Keyword
modifier akses default berarti kita tidak secara eksplisit menyatakan pengubah akses untuk kelas, field, metode, dll. Variabel atau metode yang dideklarasikan tanpa pengubah moda akses apa pun tersedia untuk kelas lain dalam paket yang sama. field dalam interface secara implisit adalah final static public dan metode dalam interface secara default adalah public.
Contoh
Variabel dan metode dapat dideklarasikan tanpa modifiers apa pun, seperti dalam contoh berikut :
String version = "1.5.1";
boolean processOrder() {
return true;
}
Private Access Modifier - Private
Metode, variabel, dan konstruktor yang dideklarasikan bersifat pribadi/private hanya dapat diakses dalam kelas yang dideklarasikan itu sendiri(kelas yang sama). private access modifier adalah tingkat akses yang paling ketat. class dan interface tidak dapat bersifat private. Variabel yang dinyatakan private dapat diakses di luar kelas, jika metode pengambil umum ada di kelas. Menggunakan modifier private adalah cara utama bahwa suatu objek merangkum dirinya sendiri dan menyembunyikan data dari dunia luar.
Contoh
Kelas berikut menggunakan kontrol private access :
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
Di sini, variabel format dari kelas Logger bersifat pribadi/private, jadi tidak ada cara bagi kelas lain untuk mengambil atau mengatur nilainya secara langsung. Jadi, untuk membuat variabel ini tersedia untuk kelas luar, kita mendefinisikan dua metode publik: getFormat (), yang mengembalikan nilai format, dan setFormat (String), yang menentukan nilainya.
Public Access Modifier - Public
class, method, constructor, interface, dll. public yang di deklarasikan dapat diakses dari kelas lain mana pun. Oleh karena itu, field, metode, blok yang dideklarasikan di dalam kelas public dapat diakses dari kelas apa pun yang termasuk dalam Java Universe. Namun, jika kelas public yang kita coba akses ada dalam paket yang berbeda, maka kelas public masih perlu diimpor. Karena pewarisan kelas, semua metode umum dan variabel kelas diwariskan oleh subclassnya.
Contoh
Fungsi berikut menggunakan kontrol akses public :
public static void main(String[] arguments) {
// ...
}
Metode main() suatu aplikasi harus bersifat public. Jika tidak, itu tidak bisa di kompilasi oleh Java kompilator.
Protected Access Modifier - Protected
Variabel, metode, dan konstruktor, yang dinyatakan protected dalam superclass hanya dapat diakses oleh subclass dalam package lain atau kelas apa pun dalam package kelas anggota yang protected. access modifier yang dilindungi tidak dapat diterapkan ke kelas dan interface. Metode, field dapat dinyatakan dilindungi, namun metode dan field di interface tidak dapat dinyatakan protected. Akses yang terlindungi memberikan kesempatan kepada subclass untuk menggunakan metode atau variabel pembantu, sambil mencegah kelas yang tidak terkait mencoba menggunakannya.
Contoh
Kelas induk berikut menggunakan kontrol akses yang protected, untuk memungkinkan kelas anaknya mengesampingkan metode openSpeaker ()
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// implementation details
}
}
class StreamingAudioPlayer {
boolean openSpeaker(Speaker sp) {
// implementation details
}
}
Di sini, jika kita mendefinisikan metode openSpeaker () sebagai protected, maka itu tidak akan dapat diakses dari kelas lain selain dari AudioPlayer. Jika kita mendefinisikannya sebagai public, maka itu akan dapat diakses oleh semua kelas luar. Namun tujuan kita adalah untuk mengekspos metode ini hanya ke subkelasnya, itulah sebabnya kami menggunakan modifier protected.
access control dan inheritance
Aturan berikut diberlakukan untuk metode yang diwariskan
- Metode yang dinyatakan public dalam superclass juga harus bersifat public di semua subclass.
- Metode yang dinyatakan protected dalam superclass juga harus protected atau umum dalam subclass; mereka tidak bisa menjadi private.
- Metode yang dinyatakan private tidak diwariskan sama sekali, jadi tidak ada aturan untuk mereka.
Non access Modifiers
Java menyediakan sejumlah pengubah non-akses untuk mencapai banyak fungsi lainnya.
- modifier static untuk membuat metode dan variabel kelas.
- modifier final untuk menyelesaikan implementasi kelas, metode, dan variabel.
- modifier abstract untuk membuat kelas dan metode abstrak.
- modifier synchronized dan volatile, yang digunakan untuk threads.
The Static Modifier
Variabel Static
Kata kunci static digunakan untuk membuat variabel yang akan ada secara independen dari setiap instance yang dibuat untuk kelas. Hanya satu salinan variabel static yang ada terlepas dari jumlah instance kelas. Variabel static juga dikenal sebagai variabel kelas.
Variabel lokal tidak dapat dinyatakan statis.
Method Static
Kata kunci static digunakan untuk membuat metode yang akan ada secara independen dari setiap instance yang dibuat untuk kelas. Metode static tidak menggunakan variabel instance dari objek apa pun dari kelas yang ditentukan. Metode static mengambil semua data dari parameter dan menghitung sesuatu dari parameter tersebut, tanpa referensi ke variabel.
Variabel dan metode kelas dapat diakses menggunakan nama kelas diikuti oleh titik dan nama variabel atau metode.
Contoh
modifier static digunakan untuk membuat metode dan variabel kelas, seperti pada contoh berikut
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");
}
}
output
Started with 0 instances
Created 500 instances
The Final Modifier
Final Variables
Variabel final dapat secara eksplisit diinisialisasi hanya sekali. Sebuah variabel referensi yang dinyatakan sebagai final tidak dapat dipindahkan untuk merujuk pada objek yang berbeda. Namun, data di dalam objek dapat diubah. Jadi, keadaan objek dapat diubah tetapi bukan referensi. Dengan variabel, modifier final sering digunakan dengan static untuk membuat variabel kelas konstan. Contoh
public class Test {
final int value = 10;
// The following are examples of declaring constants:
public static final int BOXWIDTH = 6;
static final String TITLE = "Manager";
public void changeValue() {
value = 12; // will give an error
}
}
Method final
Metode final tidak dapat ditimpa oleh subclass apa pun. Seperti yang disebutkan sebelumnya, modifier final mencegah suatu metode dimodifikasi dalam subkelas. Tujuan utama pembuatan akhir metode adalah bahwa isi metode tidak boleh diubah oleh orang luar.
Contoh
Anda menyatakan metode menggunakan pengubah akhir dalam deklarasi kelas, seperti pada contoh berikut
public class Test {
public final void changeName() {
// body of method
}
}
Class final
Tujuan utama menggunakan kelas yang dinyatakan sebagai final adalah untuk mencegah kelas menjadi subkelas. Jika kelas ditandai sebagai final maka tidak ada kelas yang dapat mewarisi fitur apa pun dari kelas final.
Contoh
public final class Test {
// body of class
}
Modifier abstract
Class Abstract
Kelas abstract tidak pernah bisa dipakai. Jika kelas dinyatakan sebagai abstract maka satu-satunya tujuan adalah agar kelas diperpanjang. Sebuah kelas tidak dapat bersifat abstract dan final (karena kelas final tidak dapat diperpanjang). Jika kelas berisi metode abstract maka kelas harus dinyatakan abstract. Jika tidak, kesalahan kompilasi akan dilemparkan.
Kelas abstrak dapat berisi metode abstract dan metode normal.
Contoh
abstract class Caravan {
private double price;
private String model;
private String year;
public abstract void goFast(); // an abstract method
public abstract void changeColor();
}
Method Abstract
Metode abstract adalah metode yang dideklarasikan tanpa implementasi apa pun. Tubuh metode (implementasi) disediakan oleh subclass. Metode abstract tidak pernah bisa menjadi final atau strict. Setiap kelas yang extends kelas abstract harus menerapkan semua metode abstract superclass, kecuali subkelas juga merupakan kelas abstract. Jika kelas berisi satu atau lebih metode abstract, maka kelas harus dinyatakan abstract. Kelas abstract tidak perlu mengandung metode abstract.
Metode abstrak berakhir dengan titik koma.
Contoh:
public abstract example ();
Contoh
public abstract class SuperClass {
abstract void m(); // abstract method
}
-----------------------------------
class SubClass extends SuperClass {
// implements the abstract method
void m() {
.........
}
}
The Synchronized
Modifier keyword synchronized digunakan untuk menunjukkan bahwa metode dapat diakses hanya dengan satu thread pada satu waktu. modifier yang disinkronkan dapat diterapkan dengan salah satu dari empat modifier akses. Contoh
public transient int limit = 55; // will not persist
public int b; // will persist
Modifier Volatile
Pengubah yang mudah digunakan untuk membantu JVM mengetahui bahwa jalur yang mengakses variabel harus selalu menggabungkan salinan pribadinya sendiri dari variabel dengan salinan master dalam memori. Mengakses variabel volatile menyinkronkan semua salinan variabel yang ada di cache dalam memori utama. Volatile hanya dapat diterapkan ke variabel instance, yang merupakan jenis objek atau private. Referensi objek volatile adalah nol.
Contoh
public class MyRunnable implements Runnable {
private volatile boolean active;
public void run() {
active = true;
while (active) { // line 1
// some code here
}
}
public void stop() {
active = false; // line 2
}
}
Biasanya, run () dipanggil dalam satu thread (yang Anda mulai menggunakan Runnable), dan stop () dipanggil dari thread lain. Jika pada baris 1, nilai yang di-cache aktif digunakan, loop mungkin tidak berhenti ketika Anda mengatur aktif ke false di baris 2. Saat itulah Anda idapat menggunakan volatile.