Pengubah Akses 'dilindungi' Java

1. Ikhtisar

Dalam bahasa pemrograman Java, kolom, konstruktor, metode, dan kelas dapat ditandai dengan pengubah akses. Dalam tutorial ini, kita akan melihat akses yang dilindungi .

2. Kata kunci yang dilindungi

Meskipun elemen yang dideklarasikan sebagai privat hanya dapat diakses oleh kelas di mana mereka dideklarasikan, kata kunci yang dilindungi memungkinkan akses dari sub-kelas dan anggota dari paket yang sama.

Dengan menggunakan kata kunci yang dilindungi , kami membuat keputusan tentang metode dan bidang mana yang harus dianggap sebagai internal dari paket atau hierarki kelas, dan mana yang diekspos ke kode luar.

3. Menyatakan Bidang, Metode, dan Konstruktor yang dilindungi

Pertama, mari buat filekelas bernama FirstClass berisi bidang yang dilindungi , metode, dan konstruktor:

public class FirstClass { protected String name; protected FirstClass(String name) { this.name = name; } protected String getName() { return name; } }

Dengan contoh ini, dengan menggunakan kata kunci yang dilindungi , kami telah memberikan akses ke bidang-bidang ini ke kelas-kelas dalam paket yang sama seperti Kelas Satu dan ke sub-kelas Kelas Satu .

4. Mengakses Field, Metode, dan Konstruktor yang dilindungi

4.1 Dari Paket yang Sama

Sekarang, mari kita lihat bagaimana kita dapat mengakses field yang dilindungi dengan membuat GenericClass baru yang dideklarasikan dalam paket yang sama dengan FirstClass :

public class GenericClass { public static void main(String[] args) { FirstClass first = new FirstClass("random name"); System.out.println("FirstClass name is " + first.getName()); first.name = "new name"; } }

Karena kelas pemanggil ini berada dalam paket yang sama dengan FirstClass, kelas ini diizinkan untuk melihat dan berinteraksi dengan semua bidang, metode, dan konstruktor yang dilindungi .

4.2. Dari Paket Berbeda

Sekarang mari kita coba berinteraksi dengan bidang-bidang ini dari kelas yang dideklarasikan dalam paket berbeda dari FirstClass :

public class SecondGenericClass { public static void main(String[] args) { FirstClass first = new FirstClass("random name"); System.out.println("FirstClass name is "+ first.getName()); first.name = "new name"; } }

Seperti yang bisa kita lihat, kita mendapatkan kesalahan kompilasi :

The constructor FirstClass(String) is not visible The method getName() from the type FirstClass is not visible The field FirstClass.name is not visible

Itulah yang kami harapkan dengan menggunakan kata kunci yang dilindungi . Ini karena SecondGenericClass tidak berada dalam paket yang sama dengan FirstClass dan tidak mensubkelasinya .

4.3 Dari Sub-Kelas

Sekarang mari kita lihat apa yang terjadi ketika kita mendeklarasikan kelas yang memperluas FirstClass tetapi dideklarasikan dalam paket yang berbeda :

public class SecondClass extends FirstClass { public SecondClass(String name) { super(name); System.out.println("SecondClass name is " + this.getName()); this.name = "new name"; } }

Seperti yang diharapkan, kami dapat mengakses semua bidang, metode, dan konstruktor yang dilindungi. Ini karena SecondClass adalah sub-kelas dari FirstClass .

5. Kelas Dalam yang dilindungi

Dalam contoh sebelumnya, kami melihat kolom, metode, dan konstruktor yang dilindungi beraksi. Ada satu kasus lagi - kelas dalam yang dilindungi .

Mari buat kelas dalam kosong ini di dalam Kelas Satu kita :

package com.baeldung.core.modifiers; public class FirstClass { // ... protected static class InnerClass { } }

Seperti yang bisa kita lihat, ini adalah kelas dalam statis, sehingga dapat dibangun dari luar instance Kelas Satu . Namun, karena diproteksi , kita hanya dapat membuat instance dari kode dalam paket yang sama dengan FirstClass .

5.1 Dari Paket yang Sama

Untuk mengujinya, mari edit GenericClass kita :

public class GenericClass { public static void main(String[] args) { // ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass(); } }

Seperti yang bisa kita lihat, kita dapat membuat instance InnerClass tanpa masalah karena GenericClass ada dalam paket yang sama dengan FirstClass .

5.2. Dari Paket Berbeda

Mari kita coba untuk instantiate InnerClass dari kami SecondGenericClass yang, seperti kita ingat, adalah luar Firstclass' paket:

public class SecondGenericClass { public static void main(String[] args) { // ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass(); } }

Seperti yang diharapkan, kami mendapatkan kesalahan kompilasi :

The type FirstClass.InnerClass is not visible

5.3. Dari Sub-Kelas

Mari kita coba melakukan hal yang sama dari SecondClass kita :

public class SecondClass extends FirstClass { public SecondClass(String name) { // ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass(); } }

Kami mengharapkan untuk membuat instantiate InnerClass kami dengan mudah. Namun, kami juga mendapatkan kesalahan kompilasi:

The constructor FirstClass.InnerClass() is not visible

Mari kita lihat deklarasi InnerClass kami :

protected static class InnerClass { }

The main reason we are getting this error is that the default constructor of a protected class is implicitly protected. In addition, SecondClassis a sub-class of FirstClass but is not a sub-class of InnerClass. Finally, we also declaredSecondClass outside FirstClass' package.

For all these reasons, SecondClass can't access the protectedInnerClass constructor.

Jika kami ingin menyelesaikan masalah ini dan mengizinkan SecondClass untuk membuat instance objek InnerClass , kami dapat secara eksplisit mendeklarasikan konstruktor publik :

protected static class InnerClass { public InnerClass() { } }

Dengan melakukan ini, kita tidak lagi mendapatkan kesalahan kompilasi, dan sekarang kita dapat membuat instance InnerClass dari SecondClass .

6. Kesimpulan

Dalam tutorial singkat ini, kita membahas pengubah akses yang dilindungi di Java. Dengan itu, kita dapat memastikan hanya mengekspos data dan metode yang diperlukan ke sub-kelas dan kelas dalam paket yang sama.

Seperti biasa, kode contoh tersedia di GitHub.