Pengubah Akses Java 'dilindungi'

1. Gambaran keseluruhan

Dalam bahasa pengaturcaraan Java, bidang, konstruktor, kaedah, dan kelas dapat ditandai dengan pengubah akses. Dalam tutorial ini, kita akan melihat akses yang dilindungi .

2. Kata kunci yang dilindungi

Walaupun elemen yang dinyatakan sebagai peribadi dapat diakses hanya oleh kelas di mana mereka diisytiharkan, kata kunci yang dilindungi membenarkan akses dari sub-kelas dan anggota pakej yang sama.

Dengan menggunakan kata kunci yang dilindungi , kami membuat keputusan mengenai kaedah dan bidang mana yang harus dipertimbangkan sebagai dalaman dari pakej atau hierarki kelas, dan yang terdedah kepada kod luar.

3. Menyatakan Medan, Kaedah, dan Pembina yang dilindungi

Pertama, mari buat akelas bernama FirstClass yang mengandungi bidang, kaedah, dan konstruktor yang dilindungi :

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 memberikan akses ke medan ini ke kelas dalam pakej yang sama dengan FirstClass dan sub-kelas FirstClass .

4. Mengakses Medan, Kaedah, dan Konstruktor yang dilindungi

4.1 Dari Pakej yang Sama

Sekarang, mari kita lihat bagaimana kita dapat mengakses medan yang dilindungi dengan membuat GenericClass baru yang dinyatakan dalam pakej 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"; } }

Oleh kerana kelas panggilan ini dalam pakej yang sama dengan FirstClass, ia dibenarkan untuk melihat dan berinteraksi dengan semua bidang, kaedah, dan pembina yang dilindungi .

4.2. Dari Pakej yang berbeza

Mari sekarang cuba berinteraksi dengan bidang ini dari kelas yang dinyatakan dalam pakej yang berbeza 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 dapat kita lihat, kita mendapat ralat 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 kerana SecondGenericClass tidak dalam pakej yang sama dengan FirstClass dan tidak menundukkannya.

4.3 Dari Sub-Kelas

Sekarang mari kita lihat apa yang berlaku apabila kita menyatakan kelas yang meluaskan FirstClass tetapi dinyatakan dalam pakej yang berbeza :

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 dijangkakan, kita dapat mengakses semua bidang, kaedah, dan pembangun yang dilindungi. Ini kerana SecondClass adalah sub-kelas FirstClass .

5. Kelas Dalam dilindungi

Dalam contoh sebelumnya, kami melihat bidang, kaedah, dan pembangun yang dilindungi sedang beraksi. Terdapat satu kes yang lebih khusus - kelas dalaman yang dilindungi .

Mari buat kelas dalaman kosong ini di FirstClass kami :

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

Seperti yang dapat kita lihat, ini adalah kelas dalaman yang statik, dan juga dapat dibina dari luar contoh FirstClass . Namun, kerana ia dilindungi , kami hanya dapat memasukkannya dari kod dalam pakej yang sama dengan FirstClass .

5.1 Dari Pakej yang Sama

Untuk menguji ini, mari kita edit GenericClass kami :

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

Seperti yang kita lihat, kita dapat membuat instansi InnerClass tanpa masalah kerana GenericClass berada dalam paket yang sama dengan FirstClass .

5.2. Dari Pakej yang berbeza

Mari kita cuba untuk memberi contoh yang InnerClass dari kami SecondGenericClass yang, seperti yang kita ingat, adalah di luar FirstClass ' pakej:

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

Seperti yang dijangkakan, kami mendapat ralat kompilasi :

The type FirstClass.InnerClass is not visible

5.3. Dari Sub-Kelas

Mari cuba melakukan perkara yang sama dari SecondClass kami :

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

Kami mengharapkan untuk mewujudkan InnerClass kami dengan mudah. Walau bagaimanapun, kami mendapat ralat kompilasi di sini juga:

The constructor FirstClass.InnerClass() is not visible

Mari lihat pernyataan 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 kita mahu untuk menyelesaikan isu ini dan membenarkan kami SecondClass untuk instantiate yang InnerClass objek, kita jelas boleh mengisytiharkan pembina awam :

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

Dengan melakukan ini, kita tidak lagi mendapat ralat kompilasi, dan sekarang kita dapat mewujudkan InnerClass dari SecondClass .

6. Kesimpulannya

Dalam tutorial ringkas ini, kami membincangkan pengubah akses terlindung di Java. Dengan itu, kami dapat memastikan hanya mendedahkan data dan kaedah yang diperlukan kepada sub-kelas dan kelas dalam pakej yang sama.

Seperti biasa, kod contoh boleh didapati di GitHub.