Apa perbedaan antara publik, dilindungi, paket-pribadi dan swasta di Jawa?

3171

Di Jawa, apakah ada aturan yang jelas tentang kapan harus menggunakan masing-masing pengubah akses, yaitu default (paket privat) public,, protecteddan private, saat membuat classdan interfacedan berurusan dengan warisan?

intrepion
sumber
161
privatebersembunyi dari kelas lain dalam paket. publicmengekspos ke kelas di luar paket. protectedadalah versi publicterbatas hanya untuk subclass.
Museful
87
@Tennenrishin - Tidak; bertentangan dengan C ++, di Java protectedmembuat metode ini juga dapat diakses dari seluruh paket. Kebodohan dalam model visibilitas Jawa ini mematahkan tujuan protected.
Nicolas Barbulesco
35
@Nicolas Dapat diakses dari seluruh paket, dengan atau tanpa protected. Sebagai pengubah akses , yang protecteddilakukan hanyalah mengekspos ke subkelas di luar paket.
Museful
15
@tennenrishin - yah, itu yang dikatakan Nicolas ... dan kamu baru saja mengulanginya sekarang. Apa yang awalnya Anda katakan adalah protected- dan saya kutip - 'adalah versi publik terbatas hanya untuk subkelas' yang tidak benar menurut penerimaan Anda sendiri karena dilindungi juga memungkinkan akses melalui seluruh paket (ergo, itu tidak membatasi akses ke subkelas. )
luis.espinal
10
Saya juga setuju dengan Nicolas bahwa mode akses yang dilindungi di Jawa bodoh. Apa yang terjadi adalah Java conflated horizontal (lattice) dan kualifikasi pembatasan akses vertikal. Cakupan default adalah pembatasan horisontal / kisi dengan kisi menjadi paket. Publik adalah batasan horisontal lain di mana kisi adalah seluruh dunia. Privat dan (C ++) dilindungi vertikal. Akan lebih baik jika kita memiliki akses lintas protected-packagesektor , katakanlah, untuk kasus-kasus langka di mana kita benar-benar membutuhkannya, sehingga protectedsetara dengan versi C ++ yang dilindungi.
luis.espinal

Jawaban:

5639

Tutorial resmi mungkin bermanfaat bagi Anda.

______________________________________________________________
| │ Kelas │ Paket │ Subkelas │ Subkelas │ Dunia |
| │ │ │ (pkg yang sama) │ (pkg berbeda) │ |
| ──────────┼───────┼────────┼─────────┼──────── ──┼──────── |
| publik │ + │ + │ + │ + │ + | 
| ──────────┼───────┼────────┼─────────┼──────── ──┼──────── |
| dilindungi │ + │ + │ + │ + │ | 
| ──────────┼───────┼────────┼─────────┼──────── ──┼──────── |
| tanpa pengubah│ + │ + │ + │ │ | 
| ──────────┼───────┼────────┼─────────┼──────── ──┼──────── |
| pribadi │ + │ │ │ │ |
| ___________ | _______ | _________ | __________ | __________ | ________ |
 +: dapat diakses kosong: tidak dapat diakses
David Segonds
sumber
5
Tabel di atas tidak benar, karena privateanggota bahkan dapat dilihat / digunakan oleh metode kelas / statis dalam file sumber yang sama.
Usagi Miyamoto
5
Anggota yang dilindungi hanya dapat diakses dari subclass dari paket yang sama tetapi tidak subclass dari paket yang berbeda. Seharusnya ada koreksi pada tabel di atas
niks
2
Dunia ada dalam proyek Anda . Saya harus menjelaskan lebih lanjut. Perpustakaan ada dalam proyek Anda, dan jika Anda membuat perpustakaan, mereka akan mengekspos kelas-kelas dan metode publik ini juga. Jadi, mengatakan hanya di dalam proyek Anda agak tidak menyenangkan. "Segala sesuatu yang menggunakannya" adalah deskripsi yang lebih baik.
adprocas
3
Misalnya, jika saya punya MyClassdan saya lakukan, AnotherClass extends MyClasssaya akan memiliki akses ke semua metode dan properti publik yang dilindungi dari dalam AnotherClass. Jika saya melakukannya MyClass myClass = new MyClass();di AnotherClasssuatu tempat - katakanlah konstruktor - Saya hanya akan memiliki akses ke metode publik jika ada dalam paket yang berbeda. Perhatikan bahwa jika saya melakukannya = new MyClass() { @Override protected void protectedMethod() { //some logic } };tampaknya saya dapat mengakses metode yang dilindungi, tetapi jenis ini sama dengan memperluasnya, tetapi sebarisnya.
adprocas
3
Sayangnya, jawaban ini terlalu menyederhanakan. Realitas sedikit lebih rumit, terutama ketika Anda mempertimbangkan protected(yang sebenarnya cukup sulit untuk dipahami sepenuhnya - kebanyakan orang yang berpikir mereka tahu apa protectedartinya sebenarnya tidak). Juga, seperti yang ditunjukkan Bohemian, itu tidak menjawab pertanyaan - ia tidak mengatakan kapan harus menggunakan setiap pengubah akses. Menurut pendapat saya, jawaban ini tidak cukup buruk untuk di-downvote, tetapi ditutup. Tetapi lebih dari 4000 suara positif? Bagaimana ini bisa terjadi?
Dawood ibn Kareem
483

(Peringatan: Saya bukan programmer Java, saya seorang programmer Perl. Perl tidak memiliki perlindungan formal yang mungkin mengapa saya memahami masalah dengan sangat baik :))

Pribadi

Seperti yang Anda pikirkan, hanya kelas yang dideklarasikan yang dapat melihatnya.

Paket Pribadi

Itu hanya dapat dilihat dan digunakan oleh paket di mana ia dinyatakan. Ini adalah default di Java (yang beberapa orang lihat sebagai kesalahan).

Terlindung

Paket Private + dapat dilihat oleh subclass atau anggota paket.

Publik

Semua orang bisa melihatnya.

Diterbitkan

Terlihat di luar kode yang saya kontrol. (Meskipun bukan sintaksis Java, penting untuk diskusi ini).

C ++ mendefinisikan level tambahan yang disebut "teman" dan semakin sedikit Anda tahu tentang itu, semakin baik.

Kapan sebaiknya Anda menggunakan apa? Seluruh ide adalah enkapsulasi untuk menyembunyikan informasi. Sebisa mungkin Anda ingin menyembunyikan detail tentang bagaimana sesuatu dilakukan dari pengguna Anda. Mengapa? Karena dengan begitu Anda dapat mengubahnya nanti dan tidak merusak kode siapa pun. Ini memungkinkan Anda mengoptimalkan, memperbaiki, mendesain ulang, dan memperbaiki bug tanpa khawatir bahwa seseorang menggunakan kode yang baru saja Anda periksa.

Jadi, aturan praktisnya adalah untuk membuat hal-hal hanya terlihat seperti seharusnya. Mulai dengan pribadi dan hanya tambahkan lebih banyak visibilitas sesuai kebutuhan. Hanya publikasikan apa yang benar-benar perlu bagi pengguna untuk mengetahuinya, setiap detail yang Anda buat publik membuat kram Anda kemampuan mendesain ulang sistem.

Jika Anda ingin pengguna dapat menyesuaikan perilaku, alih-alih membuat internal menjadi publik sehingga mereka dapat menimpanya, sering kali merupakan ide yang lebih baik untuk mendorong keberanian itu menjadi objek dan menjadikan antarmuka itu publik. Dengan begitu mereka cukup mencolokkan objek baru. Misalnya, jika Anda sedang menulis CD player dan menginginkan bit "go find info about CD ini" yang dapat dikustomisasi, daripada menjadikan metode tersebut publik, Anda akan menempatkan semua fungsionalitas itu ke dalam objeknya sendiri dan menjadikan objek Anda pengambil / penyetel publik . Dengan cara ini menjadi pelit mengungkapkan nyali Anda mendorong komposisi yang baik dan pemisahan kekhawatiran

Secara pribadi, saya tetap dengan hanya "pribadi" dan "publik". Banyak bahasa OO memilikinya. "Dilindungi" bisa berguna, tapi itu benar-benar curang. Setelah sebuah antarmuka lebih dari pribadi itu di luar kendali Anda dan Anda harus mencari kode orang lain untuk menemukan kegunaan.

Di sinilah ide "diterbitkan" masuk. Mengubah antarmuka (refactoring) mengharuskan Anda menemukan semua kode yang menggunakannya dan mengubahnya juga. Jika antarmuka bersifat pribadi, tidak ada masalah. Jika dilindungi, Anda harus mencari semua subclass Anda. Jika publik, Anda harus mencari semua kode yang menggunakan kode Anda. Terkadang ini mungkin, misalnya, jika Anda bekerja pada kode perusahaan yang hanya untuk penggunaan internal, tidak masalah jika antarmuka publik. Anda dapat mengambil semua kode dari repositori perusahaan. Tetapi jika sebuah antarmuka "diterbitkan", jika ada kode yang menggunakannya di luar kendali Anda, maka Anda disemprot. Anda harus mendukung antarmuka itu atau kode pemecahan risiko. Bahkan antarmuka yang dilindungi dapat dianggap diterbitkan (itulah sebabnya saya tidak

Banyak bahasa menemukan sifat hierarkis publik / dilindungi / pribadi terlalu terbatas dan tidak sejalan dengan kenyataan. Untuk itu, ada konsep kelas sifat , tapi itu pertunjukan lain.

Schwern
sumber
26
teman -> "Semakin sedikit Anda tahu tentang hal itu, semakin baik" ---> Ini memberikan visibilitas selektif, yang masih lebih unggul dari privasi paket. Dalam C ++, ini memiliki kegunaannya, karena tidak semua fungsi bisa menjadi fungsi anggota, dan teman lebih baik daripada publik. Tentu saja ada bahaya penyalahgunaan oleh pikiran jahat.
Sebastian Mach
30
Juga harus dicatat bahwa "protected" di C ++ memiliki arti yang berbeda - metode yang diproteksi secara pribadi bersifat privat, tetapi masih dapat dipanggil dari kelas inherit. (Berbeda dengan Jawa di mana ia dapat dipanggil oleh kelas mana pun dalam paket yang sama.)
Rhys van der Waerden
9
@RhysvanderWaerden C # sama dengan C ++ dalam aspek ini. Saya merasa aneh bahwa Java tidak mengizinkan untuk mendeklarasikan anggota yang dapat diakses oleh subkelas tetapi tidak seluruh paket. Ini agak terbalik bagi saya - sebuah paket memiliki cakupan yang lebih luas daripada kelas anak-anak!
Konrad Morawski
15
Paket IMHO @KonradMorawski memiliki cakupan yang lebih kecil daripada subclass. Jika Anda belum mendeklarasikan final kelas Anda, pengguna harus dapat mensubklasifikasikannya - jadi java protected adalah bagian dari antarmuka yang Anda terbitkan. OTOH, paket secara implisit dikembangkan oleh satu organisasi: mis. Com.mycompany.mypackage. Jika kode Anda menyatakan dirinya dalam paket saya, Anda secara implisit menyatakan diri Anda bagian dari organisasi saya, jadi kami harus berkomunikasi. Dengan demikian, paket menerbitkan ke audiens yang lebih kecil / lebih mudah dijangkau (orang-orang di perusahaan saya) daripada subclass (orang-orang yang memperluas objek saya) dan dengan demikian dianggap sebagai visibilitas yang lebih rendah.
Eponim
2
friendbagus untuk mendefinisikan hubungan khusus antar kelas. Ini memungkinkan enkapsulasi unggul dalam banyak kasus bila digunakan dengan benar. Sebagai contoh, ini dapat digunakan oleh kelas pabrik yang diistimewakan untuk menyuntikkan dependensi internal ke dalam tipe yang dibangun. Itu memiliki nama yang buruk karena orang yang tidak peduli dengan benar memelihara model objek yang dirancang dengan baik dapat menyalahgunakannya untuk meringankan beban kerja mereka.
Dennis
434

Berikut adalah versi tabel yang lebih baik, yang juga menyertakan kolom untuk modul.

Pengubah Akses Java

Penjelasan

  • Seorang pribadi anggota ( i) adalah hanya dapat diakses di dalam kelas yang sama seperti yang dinyatakan.

  • Anggota tanpa pengubah akses ( j) hanya dapat diakses di dalam kelas dalam paket yang sama.

  • Sebuah dilindungi anggota ( k) dapat diakses di semua kelas dalam paket yang sama dan dalam subclass dalam paket lainnya.

  • Seorang public anggota ( l) dapat diakses oleh semua kelas (kecuali berada dalam modul yang tidak mengekspor paket itu dinyatakan dalam).


Pengubah mana yang harus dipilih?

Access modifiers adalah alat untuk membantu Anda mencegah enkapsulasi (*) yang tidak disengaja . Tanyakan pada diri Anda apakah Anda bermaksud member untuk menjadi sesuatu yang internal untuk kelas, paket, hirarki kelas atau tidak internal sama sekali, dan pilih tingkat akses yang sesuai.

Contoh:

  • Bidang long internalCountermungkin harus pribadi karena dapat diubah dan detail implementasi.
  • Kelas yang seharusnya hanya dipakai di kelas pabrik (dalam paket yang sama) harus memiliki konstruktor terbatas paket, karena seharusnya tidak mungkin untuk memanggilnya langsung dari luar paket.
  • void beforeRender()Metode internal yang disebut tepat sebelum rendering dan digunakan sebagai hook di subclass harus dilindungi.
  • Sebuah void saveGame(File dst)metode yang disebut dari kode GUI harus publik.

(*) Apa sebenarnya enkapsulasi?

aioobe
sumber
11
Hanya mengatakan: ada banyak orang yang memiliki masalah dengan membedakan warna merah / hijau. Tabel menggunakan skema pewarnaan merah / hijau (atau kuning / oranye / ...) jarang "lebih baik" dalam hal apa pun ;-)
GhostCat
1
@ HostCat, saya tidak setuju. Saya pikir merah / disejajarkan hijau intuitif dengan "karya" / "tidak bekerja" bagi banyak orang, yakni adalah lebih baik daripada banyak alternatif.
aioobe
8
colourblindawareness.org/colour-blindness/… ... 8% pria buta warna dapat dibagi kira-kira menjadi 1% deuteranope, 1% protanope, 1% protanomalous, dan 5% deuteranomalous . Dan karena saya adalah salah satu dari 50% dari 5% itu, yakinlah: merah / hijau menyebalkan.
GhostCat
6
@GhostCat Ok .. itu bagian yang lebih besar dari yang saya perkirakan. Saya mengunggah gambar dalam simulator buta warna ini dan menguji semua mode yang berbeda. Bahkan dalam mode monokromasi / achromatopsia perbedaan warna masuk akal. Dapatkah Anda melihat perbedaannya atau apakah simulator dimatikan? (Saya masih berpendapat bahwa merah / hijau sangat intuitif untuk orang yang melihat warna.)
aioobe
3
Saya dapat melihat perbedaannya, tetapi saya juga dapat lulus setengah dari tes buta warna yang harus kita lakukan di Jerman untuk SIM ;-) ... tapi saya pikir simulator seperti itu "cukup baik".
GhostCat
206
____________________________________________________________________
                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |              |          |              |     
————————————————+———————————————+———————————+———————————————+———————
protected       |              |          |              |      
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |              |          |              |      
————————————————+———————————————+———————————+———————————————+———————
private         |              |          |              |       
____________________________________________________________________
Abdull
sumber
1
Layak dikatakan dengan kata-kata - "Pengubah yang dilindungi membuat objek tersedia di paket lain, sedangkan default / tanpa pengubah membatasi akses ke paket yang sama"
vanguard69
2
@ vanguard69, protectedpengubah membuat hal yang ditandai (kelas, metode, atau bidang) tersedia untuk beberapa kelas lain dalam beberapa paket lain hanya jika mengatakan kelas lain adalah subkelas dari kelas di mana hal yangprotected ditandai ditandai .
Abdull
"tidak kosong"? "subclass ini dalam paket lain"? Hah. Saya pikir saya tahu Jawa.
lihat
@AlexanderFarber Anda mengoptimalkan untuk konfigurasi browser tertentu? Ini adalah chrome saya sekarang dan ini adalah Firefox
sehe
Hmm, mari kembalikan perubahan saya
Alexander Farber
165

Aturan mudah. Mulailah dengan mendeklarasikan semuanya pribadi. Dan kemudian maju ke arah publik ketika kebutuhan muncul dan desain menjaminnya.

Saat mengekspos anggota bertanya pada diri sendiri apakah Anda mengekspos pilihan representasi atau pilihan abstraksi. Yang pertama adalah sesuatu yang ingin Anda hindari karena akan memperkenalkan terlalu banyak ketergantungan pada representasi aktual daripada pada perilaku yang dapat diamati.

Sebagai aturan umum saya mencoba untuk menghindari implementasi metode utama dengan subclassing; terlalu mudah untuk mengacaukan logika. Nyatakan metode yang dilindungi abstrak jika Anda bermaksud menimpanya.

Juga, gunakan anotasi @Override saat menimpa agar hal-hal tidak rusak saat Anda refactor.

John Nilsson
sumber
3
@RuchirBaronia, "world" = semua kode dalam aplikasi, di mana pun itu.
Andrejs
116

Ini sebenarnya sedikit lebih rumit daripada tampilan kotak sederhana. Grid memberi tahu Anda apakah suatu akses diizinkan, tetapi apa sebenarnya yang dimaksud dengan akses? Juga, tingkat akses berinteraksi dengan kelas bersarang dan pewarisan dengan cara yang kompleks.

Akses "default" (ditentukan oleh tidak adanya kata kunci) juga disebut paket-pribadi . Pengecualian: dalam sebuah antarmuka, tidak ada pengubah berarti akses publik; pengubah selain publik dilarang. Konstanta Enum selalu bersifat publik.

Ringkasan

Apakah akses ke anggota dengan specifier akses ini diizinkan?

  • Anggota adalah private: Hanya jika anggota didefinisikan dalam kelas yang sama dengan kode panggilan.
  • Anggota adalah paket pribadi: Hanya jika kode panggilan ada di dalam anggota yang segera melampirkan paket.
  • Anggota adalah protected: Paket yang sama, atau jika anggota didefinisikan dalam kelas super kelas yang berisi kode panggilan.
  • Anggota adalah public: Ya.

Penentu akses apa yang berlaku untuk

Variabel lokal dan parameter formal tidak dapat mengambil penentu akses. Karena mereka secara inheren tidak dapat diakses ke luar sesuai dengan aturan pelingkupan, mereka secara efektif bersifat pribadi.

Untuk kelas dalam ruang lingkup teratas, hanya publicpaket dan pribadi yang diizinkan. Pilihan desain ini mungkin karena protecteddan privateakan berlebihan pada tingkat paket (tidak ada warisan paket).

Semua penentu akses dimungkinkan pada anggota kelas (konstruktor, metode dan fungsi anggota statis, kelas bersarang).

Terkait: Aksesibilitas Kelas Java

Memesan

Penentu akses dapat dipesan secara ketat

publik> terproteksi> paket-pribadi> pribadi

artinya publicmenyediakan akses terbanyak, privatepaling tidak. Referensi apa pun yang mungkin pada anggota pribadi juga berlaku untuk anggota paket-pribadi; referensi apa pun kepada anggota paket-pribadi berlaku pada anggota yang dilindungi, dan seterusnya. (Memberikan akses ke anggota yang dilindungi ke kelas lain dalam paket yang sama dianggap sebagai kesalahan.)

Catatan

  • Metode kelas ini yang diizinkan untuk mengakses anggota pribadi dari benda-benda lain dari kelas yang sama. Lebih tepatnya, metode kelas C dapat mengakses anggota pribadi C pada objek dari setiap subkelas C. Java tidak mendukung pembatasan akses dengan contoh, hanya berdasarkan kelas. (Bandingkan dengan Scala, yang mendukung penggunaannya private[this].)
  • Anda memerlukan akses ke konstruktor untuk membangun objek. Jadi jika semua konstruktor bersifat pribadi, kelas hanya dapat dibangun dengan kode yang tinggal di dalam kelas (biasanya metode pabrik statis atau penginisialisasi variabel statis). Demikian pula untuk konstruktor paket-pribadi atau dilindungi.
    • Hanya memiliki konstruktor pribadi juga berarti bahwa kelas tidak dapat subklas secara eksternal, karena Java mengharuskan konstruktor subkelas untuk secara implisit atau eksplisit memanggil konstruktor superclass. (Namun, ia bisa berisi kelas bertingkat yang mensubclassnya.)

Kelas batin

Anda juga harus mempertimbangkan cakupan bersarang , seperti kelas dalam. Contoh dari kompleksitas adalah bahwa kelas dalam memiliki anggota, yang mereka sendiri dapat mengambil pengubah akses. Jadi, Anda dapat memiliki kelas batin pribadi dengan anggota publik; dapatkah anggota tersebut diakses? (Lihat di bawah.) Aturan umum adalah untuk melihat lingkup dan berpikir secara rekursif untuk melihat apakah Anda dapat mengakses setiap level.

Namun, ini cukup rumit, dan untuk detail lengkap, lihat Spesifikasi Bahasa Jawa . (Ya, ada bug penyusun di masa lalu.)

Untuk merasakan bagaimana interaksi ini, pertimbangkan contoh ini. Dimungkinkan untuk "membocorkan" kelas batin pribadi; ini biasanya peringatan:

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

Output kompiler:

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

Beberapa pertanyaan terkait:

Siput mekanik
sumber
1
"pengubah selain publik dilarang" - pada Java 9, ini tidak lagi terjadi: antarmuka juga dapat memiliki metode pribadi.
MC Emperor
96

Sebagai aturan praktis:

  • private: ruang lingkup kelas.
  • default(atau package-private): ruang lingkup paket.
  • protected: package scope + child(seperti paket, tetapi kami dapat mensubklasifikasikannya dari paket yang berbeda). Pengubah yang dilindungi selalu menjaga hubungan "induk-anak".
  • public: dimana mana.

Akibatnya, jika kami membagi hak akses menjadi tiga hak:

  • (D) irect (dipanggil dari metode di dalam kelas yang sama, atau melalui sintaks "ini").
  • (R) eference (memanggil metode menggunakan referensi ke kelas, atau melalui sintaks "dot").
  • (I) warisan (via subclassing).

maka kita memiliki tabel sederhana ini:

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+
nxhoaf
sumber
54

Singkatnya

  • public: dapat diakses dari mana saja.
  • protected: dapat diakses oleh kelas-kelas dari paket yang sama dan subclass yang berada dalam paket apa pun.
  • default (tidak ada pengubah yang ditentukan): dapat diakses oleh kelas-kelas dari paket yang sama.
  • private: dapat diakses hanya dalam kelas yang sama.
Ravi
sumber
48

Pengubah akses yang paling disalahpahami di Jawa adalah protected. Kita tahu bahwa ini mirip dengan pengubah standar dengan satu pengecualian di mana subclass dapat melihatnya. Tapi bagaimana caranya? Berikut adalah contoh yang mudah-mudahan menjelaskan kebingungan:

  • Asumsikan bahwa kita memiliki 2 kelas; Fatherdan Son, masing-masing dalam paketnya sendiri:

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
  • Mari tambahkan metode yang dilindungi foo()ke Father.

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
  • Metode foo()ini dapat dipanggil dalam 4 konteks:

    1. Di dalam kelas yang terletak di paket yang sama di mana foo()didefinisikan ( fatherpackage):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
    2. Di dalam subkelas, pada instance saat ini melalui thisatau super:

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
    3. Pada referensi yang tipenya kelas yang sama:

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
    4. Pada referensi yang jenisnya adalah kelas induk dan itu ada di dalam paket di mana foo()didefinisikan ( fatherpackage) [Ini dapat dimasukkan di dalam konteks no. 1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
  • Situasi berikut tidak valid.

    1. Pada referensi yang jenisnya adalah kelas induk dan itu berada di luar paket di mana foo()didefinisikan ( fatherpackage):

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
    2. Non-subclass di dalam paket subclass (Subclass mewarisi anggota yang dilindungi dari induknya, dan itu membuat mereka pribadi untuk non-subclass):

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
Eng.Fouad
sumber
Object#clone()adalah contoh protectedanggota.
Eng.Fouad
Apa perbedaan antara melakukan super.foo()dan situasi tidak valid pertama f.foo()?
cst1992
1
@ cst1992 Sangat membingungkan tetapi lihat Spesifikasi Bahasa Jawa 6.6.2: "Anggota yang dilindungi atau konstruktor dari suatu objek dapat diakses dari luar paket yang hanya dinyatakan oleh kode yang bertanggung jawab untuk implementasi objek itu". Dengan super.foo () referensi "super" adalah "bertanggung jawab langsung untuk implementasi" tetapi referensi "f" tidak. Mengapa? Karena Anda dapat 100% yakin bahwa "super" adalah tipe Ayah, tetapi tidak untuk "f"; pada saat run-time itu bisa menjadi sub-tipe Ayah lainnya. Lihat docs.oracle.com/javase/specs/jls/se9/html/…
skomisa
1
Sangat menyegarkan membaca jawaban dari seseorang yang mengerti protected. Sayangnya, semua jawaban lain di halaman ini yang mendefinisikannya protectedagak salah.
Dawood ibn Kareem
30

Pribadi

  • Metode, Variabel dan Konstruktor

Metode, Variabel dan Konstruktor yang dideklarasikan pribadi hanya dapat diakses di dalam kelas yang dideklarasikan sendiri.

  • Kelas dan Antarmuka

Pengubah akses pribadi adalah tingkat akses yang paling ketat. Kelas dan antarmuka tidak boleh bersifat pribadi.

Catatan

Variabel yang dideklarasikan pribadi dapat diakses di luar kelas jika metode pengambil publik hadir di kelas. Variabel, metode dan konstruktor yang dinyatakan dilindungi dalam superclass hanya dapat diakses oleh subkelas dalam paket lain atau kelas apa pun di dalam paket kelas anggota yang dilindungi.


Terlindung

  • Kelas dan Antarmuka

Pengubah akses yang dilindungi tidak dapat diterapkan ke kelas dan antarmuka.

Metode, bidang dapat dinyatakan terlindungi, namun metode dan bidang dalam antarmuka tidak dapat dinyatakan terlindungi.

Catatan

Akses yang dilindungi memberi subkelas kesempatan untuk menggunakan metode atau variabel pembantu, sambil mencegah kelas yang tidak terkait mencoba menggunakannya.


Publik

Kelas, metode, konstruktor, antarmuka dll yang dinyatakan publik dapat diakses dari kelas lain.

Oleh karena itu, bidang, metode, blok yang dideklarasikan di dalam kelas publik dapat diakses dari kelas apa saja yang termasuk dalam Java Universe.

  • Paket berbeda

Namun jika kelas publik yang kami coba akses ada dalam paket yang berbeda, maka kelas publik masih perlu diimpor.

Karena pewarisan kelas, semua metode publik dan variabel dari suatu kelas diwarisi oleh subkelasnya.


Default -Tidak ada kata kunci:

Pengubah akses default berarti kami tidak secara eksplisit mendeklarasikan pengubah akses untuk kelas, bidang, metode, dll.

  • Dalam Paket yang sama

Variabel atau metode yang dideklarasikan tanpa pengubah kontrol akses tersedia untuk kelas lain dalam paket yang sama. Bidang-bidang dalam suatu antarmuka secara implisit bersifat public static final dan metode-metode dalam suatu antarmuka secara default adalah publik.

Catatan

Kami tidak dapat mengesampingkan bidang Statis. Jika Anda mencoba menimpanya, tidak ada kesalahan apa pun, tetapi tidak berfungsi seperti yang kami kecuali.

Jawaban terkait

Tautan referensi

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm

Nambi
sumber
21

Perbedaannya dapat ditemukan dalam tautan yang sudah disediakan tetapi yang digunakan biasanya merujuk pada "Prinsip Pengetahuan Paling Sedikit". Hanya izinkan visibilitas terendah yang dibutuhkan.

Joe Phillips
sumber
20

Pribadi : Akses terbatas ke kelas saja

Default (tanpa pengubah) : Akses terbatas ke kelas dan paket

Dilindungi : Akses terbatas ke kelas, paket, dan subkelas (baik paket dalam maupun luar)

Umum : Dapat diakses ke kelas, paket (semua), dan subclass ... Singkatnya, di mana-mana.

samkit shah
sumber
17

Akses pengubah ada untuk membatasi akses di beberapa tingkatan.

Publik: Ini pada dasarnya sesederhana Anda dapat mengakses dari kelas mana pun apakah itu dalam paket yang sama atau tidak.

Untuk mengakses jika Anda berada dalam paket yang sama, Anda dapat mengakses secara langsung, tetapi jika Anda berada dalam paket lain maka Anda dapat membuat objek kelas.

Default: Ini dapat diakses dalam paket yang sama dari salah satu kelas paket.

Untuk mengakses Anda dapat membuat objek kelas. Tetapi Anda tidak dapat mengakses variabel ini di luar paket.

Dilindungi: Anda dapat mengakses variabel dalam paket yang sama serta subkelas dalam paket lainnya. jadi pada dasarnya itu adalah perilaku bawaan + Warisan .

Untuk mengakses bidang yang dilindungi didefinisikan dalam kelas dasar Anda dapat membuat objek kelas anak.

Pribadi: ini dapat diakses di kelas yang sama.

Dalam metode non-statis Anda dapat mengakses secara langsung karena referensi ini (juga dalam konstruktor) tetapi untuk mengakses dalam metode statis Anda perlu membuat objek kelas.

Prashant
sumber
16

Akses pengubah di Jawa.

Pengubah akses Java digunakan untuk menyediakan kontrol akses di Jawa.

1. Default:

Dapat diakses oleh kelas hanya dalam paket yang sama.

Sebagai contoh,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

Akses ini lebih terbatas daripada publik dan dilindungi, tetapi kurang dibatasi daripada pribadi.

2. Umum

Dapat diakses dari mana saja. (Akses Global)

Sebagai contoh,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

Keluaran: Halo

3. Pribadi

Hanya dapat diakses di dalam kelas yang sama.

Jika Anda mencoba mengakses anggota pribadi di satu kelas di kelas lain akan menimbulkan kesalahan kompilasi. Sebagai contoh,

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. Dilindungi

Dapat diakses hanya untuk kelas-kelas dalam paket yang sama dan ke subclass

Sebagai contoh,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

Keluaran: Halo

Masukkan deskripsi gambar di sini

Affy
sumber
14
  • publik - dapat diakses dari mana saja dalam aplikasi.

  • default - dapat diakses dari paket.

  • dilindungi - dapat diakses dari paket dan sub-kelas dalam paket lainnya. demikian juga

  • pribadi - hanya dapat diakses dari kelasnya.

Shailendra Singh
sumber
14

Terlihat ke paket. Default. Tidak diperlukan pengubah.

Terlihat hanya untuk kelas ( pribadi ).

Terlihat oleh dunia ( publik ).

Dapat dilihat oleh paket dan semua subclass ( dilindungi ).

Variabel dan metode dapat dideklarasikan tanpa pengubah apa pun yang dipanggil. Contoh default:

String name = "john";

public int age(){
    return age;
}

Pengubah akses pribadi - pribadi:

Metode, variabel, dan konstruktor yang dideklarasikan pribadi hanya dapat diakses di dalam kelas yang dideklarasikan sendiri. Pengubah akses pribadi adalah tingkat akses yang paling ketat. Kelas dan antarmuka tidak boleh bersifat pribadi.

Variabel yang dideklarasikan pribadi dapat diakses di luar kelas jika metode pengambil publik hadir di kelas.

Menggunakan pengubah pribadi adalah cara utama bahwa suatu objek merangkum dirinya sendiri dan menyembunyikan data dari dunia luar.

Contoh:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

Pengubah akses publik - publik:

Kelas, metode, konstruktor, antarmuka, dll. Yang dinyatakan publik dapat diakses dari kelas lain. Oleh karena itu bidang, metode, blok yang dideklarasikan di dalam kelas publik dapat diakses dari kelas apa pun yang termasuk ke dalam alam semesta Jawa.

Namun, jika kelas publik yang kami coba akses ada dalam paket yang berbeda, maka kelas publik masih perlu diimpor.

Karena pewarisan kelas, semua metode publik dan variabel dari suatu kelas diwarisi oleh subkelasnya.

Contoh:

public void cal(){

}

Pengubah akses yang dilindungi - dilindungi:

Variabel, metode dan konstruktor yang dinyatakan dilindungi dalam superclass hanya dapat diakses oleh subkelas dalam paket lain atau kelas apa pun di dalam paket kelas anggota yang dilindungi.

Pengubah akses yang dilindungi tidak dapat diterapkan ke kelas dan antarmuka. Metode, bidang dapat dinyatakan terlindungi, namun metode dan bidang dalam antarmuka tidak dapat dinyatakan terlindungi.

Akses yang dilindungi memberi subkelas kesempatan untuk menggunakan metode atau variabel pembantu, sambil mencegah kelas yang tidak terkait mencoba menggunakannya.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}
amila isura
sumber
12

Halaman ini menulis dengan baik tentang pengubah akses yang dilindungi & default

.... Protected: Modifier akses terlindungi adalah sedikit rumit dan bisa Anda katakan adalah superset dari modifier akses default. Anggota yang dilindungi sama dengan anggota standar sejauh menyangkut akses dalam paket yang sama. Perbedaannya adalah bahwa, anggota yang dilindungi juga dapat diakses ke subclass dari kelas di mana anggota tersebut dinyatakan berada di luar paket di mana kelas induknya ada.

Tetapi anggota yang dilindungi ini "dapat diakses di luar paket hanya melalui warisan". yaitu Anda dapat mengakses anggota kelas yang dilindungi dalam hadiah subkelasnya dalam beberapa paket lain secara langsung seolah-olah anggota tersebut hadir di dalam subkelas itu sendiri. Tetapi anggota yang dilindungi itu tidak akan dapat diakses di subkelas di luar paket dengan menggunakan referensi kelas induk. ....

Dameng
sumber
Hanya untuk menambahkan ini "Setelah anak mendapat akses ke anggota kelas induk yang dilindungi, itu menjadi pribadi (atau lebih tepatnya saya akan mengatakan anggota pribadi khusus yang dapat diwarisi oleh subclass dari subclass) anggota dari subclass."
Anand
9

Jawaban David memberikan arti dari setiap pengubah akses. Adapun kapan harus menggunakan masing-masing, saya sarankan membuat publik semua kelas dan metode masing-masing kelas yang dimaksudkan untuk penggunaan eksternal (API-nya), dan segala sesuatu yang lain pribadi.

Seiring waktu Anda akan mengembangkan rasa kapan membuat beberapa kelas paket-privat dan kapan mendeklarasikan metode tertentu yang dilindungi untuk digunakan dalam subclass.

Dov Wasserman
sumber
6

Catatan: Ini hanya suplemen untuk jawaban yang diterima.

Ini terkait dengan Java Access Modifiers .

Dari Java Access Modifiers :

Pengubah akses Java menentukan kelas mana yang dapat mengakses kelas tertentu dan bidangnya, konstruktor dan metode. Pengubah akses dapat ditentukan secara terpisah untuk kelas, konstruktor, bidang, dan metode. Pengubah akses Java juga kadang-kadang disebut dalam pidato harian sebagai penentu akses Java, tetapi nama yang benar adalah pengubah akses Java. Kelas, bidang, konstruktor dan metode dapat memiliki satu dari empat pengubah akses Java yang berbeda:

  • Daftar barang
  • pribadi
  • default (paket)
  • terlindung
  • publik

Dari Mengontrol Akses ke Anggota tutorial Kelas :

Pengubah tingkat akses menentukan apakah kelas lain dapat menggunakan bidang tertentu atau memanggil metode tertentu. Ada dua tingkat kontrol akses:

  • Di tingkat atas — publik, atau paket-pribadi (tidak ada pengubah eksplisit).
  • Di tingkat anggota — publik, pribadi, dilindungi, atau paket-pribadi (tanpa pengubah eksplisit).

Kelas dapat dideklarasikan dengan publik pengubah, dalam hal ini kelas tersebut terlihat oleh semua kelas di mana saja. Jika suatu kelas tidak memiliki pengubah (default, juga dikenal sebagai paket-pribadi), itu hanya terlihat dalam paket sendiri

Tabel berikut menunjukkan akses ke anggota yang diizinkan oleh masing-masing pengubah.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
 Modifier     Class  Package  Subclass  World 
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
 public       Y      Y        Y         Y     
 protected    Y      Y        Y         N     
 no modifier  Y      Y        N         N     
 private      Y      N        N         N     
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

Kolom data pertama menunjukkan apakah kelas itu sendiri memiliki akses ke anggota yang ditentukan oleh tingkat akses. Seperti yang Anda lihat, kelas selalu memiliki akses ke anggotanya sendiri. Kolom kedua menunjukkan apakah kelas dalam paket yang sama dengan kelas (terlepas dari asal usulnya) memiliki akses ke anggota. Kolom ketiga menunjukkan apakah subclass kelas yang dinyatakan di luar paket ini memiliki akses ke anggota. Kolom keempat menunjukkan apakah semua kelas memiliki akses ke anggota.

Tingkat akses memengaruhi Anda dalam dua cara. Pertama, ketika Anda menggunakan kelas yang berasal dari sumber lain, seperti kelas di platform Java, tingkat akses menentukan anggota kelas mana yang dapat digunakan oleh kelas Anda sendiri. Kedua, ketika Anda menulis kelas, Anda perlu memutuskan tingkat akses apa yang harus dimiliki setiap variabel anggota dan setiap metode di kelas Anda.

ישו אוהב אותך
sumber
1
apa sebenarnya suplemen itu, dan mengapa itu bukan suntingan untuk posting yang ada?
lihat
Suplemennya adalah Access Modifiers. Kenapa tidak diedit? Untuk menjaga agar jawaban yang diterima tidak berubah demi sejarah dan untuk memberikan jawaban saya.
ישו אוהב אותך
5

Publik Dilindungi Default dan pribadi adalah pengubah akses.

Mereka dimaksudkan untuk enkapsulasi, atau menyembunyikan dan menunjukkan isi kelas.

  1. Kelas dapat bersifat publik atau default
  2. Anggota kelas dapat bersifat publik, dilindungi, default atau pribadi.

Pribadi tidak dapat diakses di luar kelas Default hanya dapat diakses dalam paket. Diproteksi dalam paket dan juga kelas apa pun yang memperluasnya. Publik terbuka untuk semua.

Biasanya, variabel anggota didefinisikan pribadi, tetapi metode anggota bersifat publik.

richa_v
sumber
Defaultbukan pengubah akses, dan dua lainnya salah eja.
Marquis of Lorne
5

Sering kali saya menyadari bahwa mengingat konsep dasar bahasa apa pun dapat dimungkinkan dengan membuat analogi dunia nyata. Inilah analogi saya untuk memahami pengubah akses di Jawa:

Mari kita asumsikan bahwa Anda adalah seorang mahasiswa di universitas dan Anda memiliki teman yang akan mengunjungi Anda selama akhir pekan. Misalkan ada patung besar pendiri universitas di tengah kampus.

  • Ketika Anda membawanya ke kampus, hal pertama yang Anda dan teman Anda lihat adalah patung ini. Ini berarti bahwa siapa pun yang berjalan di kampus dapat melihat patung itu tanpa izin universitas. Ini menjadikan patung itu PUBLIK .

  • Selanjutnya, Anda ingin membawa teman Anda ke asrama Anda, tetapi untuk itu Anda perlu mendaftarkannya sebagai pengunjung. Ini berarti dia mendapat akses masuk (yang sama dengan milikmu) untuk masuk ke berbagai gedung di kampus. Ini akan menjadikan kartu aksesnya sebagai PROTECTED .

  • Teman Anda ingin masuk ke WiFi kampus tetapi tidak memiliki kredensial untuk melakukannya. Satu-satunya cara dia bisa online adalah jika Anda membagikan login Anda dengannya. (Ingat, setiap siswa yang kuliah di universitas juga memiliki kredensial masuk ini). Ini akan membuat kredensial masuk Anda sebagai TANPA MODIFIER .

  • Akhirnya, teman Anda ingin membaca laporan kemajuan Anda untuk semester yang diposting di situs web. Namun, setiap siswa memiliki login pribadi mereka sendiri untuk mengakses bagian situs web kampus ini. Ini akan menjadikan kredensial ini PRIVATE .

Semoga ini membantu!

Coder Greedy
sumber
4

Ketika Anda memikirkan pengubah akses, pikirkan saja dengan cara ini (berlaku untuk variabel dan metode ):

public -> dapat diakses dari mana saja
private -> hanya dapat diakses dalam kelas yang sama tempat dideklarasikan

Sekarang kebingungan muncul ketika datang ke defaultdanprotected

default-> Tidak ada kata kunci pengubah akses. Ini berarti tersedia secara ketat di dalam paket kelas. Tidak ada tempat luar paket itu dapat diakses.

protected-> Sedikit lebih ketat daripada defaultdan terpisah dari kelas paket yang sama dapat diakses oleh sub kelas di luar paket itu dinyatakan.

Pritam Banerjee
sumber
4

Akses Java memodifikasi yang dapat Anda gunakan

masukkan deskripsi gambar di sini

Akses pengubah bisa berlaku untuk class, field[Tentang] , method. Coba akses, subkelas, atau abaikan ini.

  • Akses ke fieldatau methodmelalui aclass .
  • Warisan. classPengubah akses penerus (subclass) dapat berupa apa saja. methodPengubah akses pengganti (harus diganti) harus sama atau perluas diperluas

Kelas tingkat atas (ruang lingkup tingkat pertama) dapat publicdan default. Nested class[Tentang] dapat memilikinya

package tidak berlaku untuk hirarki paket

Pengubah akses cepat

yoAlex5
sumber
2

Ini semua tentang enkapsulasi (atau seperti yang dikatakan Joe Phillips, paling tidak pengetahuan ).

Mulailah dengan yang paling restriktif (pribadi) dan lihat apakah Anda memerlukan pengubah yang kurang ketat nanti.

Kita semua menggunakan metode dan pengubah anggota seperti pribadi, publik, ... tetapi satu hal yang terlalu sedikit pengembang lakukan adalah menggunakan paket untuk berorganisasi kode secara logis.

Sebagai contoh: Anda dapat memasukkan metode keamanan sensitif dalam paket 'keamanan'. Kemudian letakkan kelas publik yang mengakses beberapa kode keamanan terkait dalam paket ini tetapi menjaga paket kelas keamanan lainnya pribadi . Dengan demikian pengembang lain hanya akan dapat menggunakan kelas yang tersedia untuk umum dari luar paket ini (kecuali mereka mengubah pengubah). Ini bukan fitur keamanan, tetapi akan memandu penggunaan.

Outside world -> Package (SecurityEntryClass ---> Package private classes)

Hal lain adalah bahwa kelas-kelas yang sangat tergantung satu sama lain dapat berakhir dalam paket yang sama dan pada akhirnya bisa dire-refoured atau digabung jika ketergantungannya terlalu kuat.

Jika sebaliknya Anda menetapkan semuanya sebagai publik , tidak akan jelas apa yang harus atau tidak boleh diakses, yang dapat menyebabkan penulisan banyak javadoc (yang tidak memberlakukan apa pun melalui kompiler ...).

Christophe Roussy
sumber
2

jenis-pribadi-yang dilindungi-publik-sempurna-analogi-untuk-variabel-data

Berikut blok diagram menjelaskan bagaimana anggota data kelas dasar yang diwariskan ketika diturunkan kelas modus akses pribadi .

masukkan deskripsi gambar di sini

Catatan: Mendeklarasikan anggota data dengan specifier akses pribadi dikenal sebagai penyembunyian data.

Sumber: Penentu Akses - Pribadi, Publik dan Dilindungi

leonidaa
sumber
1
Pertanyaannya adalah tentang Java, bukan C ++.
Benoit
1
@ Benit Tapi apa yang telah saya posting, gambar-gambar khusus, tidak sama untuk keduanya: java dan c ++? Aturan ini tidak berlaku untuk java juga? terima kasih
leonidaa
2
Di C ++ hanya ada 3 pengubah, sementara ada 4 di java.
Benoit
1
analoginya bagus, tetapi specifier akses default tidak ada,
mss
1
OP mengajukan pertanyaan "Apa perbedaan antara publik, dilindungi, paket-pribadi dan swasta di Jawa?"
JL_SO
2

Dua sen saya :)

pribadi:

class -> kelas level atas tidak boleh privat. kelas batin dapat bersifat pribadi yang dapat diakses dari kelas yang sama.

variabel instan -> hanya dapat diakses di kelas. Tidak dapat mengakses di luar kelas.

paket-pribadi:

kelas -> kelas tingkat atas bisa menjadi paket-pribadi. Ini hanya dapat diakses dari paket yang sama. Bukan dari sub paket, bukan dari paket luar.

variabel instan -> dapat diakses dari paket yang sama. Bukan dari sub paket, bukan dari paket luar.

terlindung:

kelas -> kelas tingkat atas tidak dapat dilindungi.

variabel instan -> Hanya dapat diakses dalam paket atau subpackage yang sama. Hanya dapat mengakses di luar paket sambil memperluas kelas.

publik:

class -> dapat diakses dari paket / subpackage / paket lain

variabel instan -> dapat diakses dari paket / subpackage / paket lain

Inilah jawaban terperinci

https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md

Mudassar
sumber
1
  • publik

    Jika anggota kelas dideklarasikan dengan publik maka itu dapat diakses dari mana saja

  • terlindung

    Jika anggota kelas dideklarasikan dengan kata kunci yang diproteksi maka dapat diakses dari anggota kelas yang sama, anggota kelas luar dalam paket yang sama dan anggota kelas yang diwarisi. Jika seorang anggota kelas dilindungi maka TIDAK dapat diakses dari kelas paket luar kecuali kelas paket luar diwarisi yaitu memperluas superclass paket lainnya. Tetapi anggota kelas yang dilindungi selalu tersedia untuk kelas paket yang sama. TIDAK masalah cuaca, kelas paket yang sama diwarisi atau TIDAK

  • standar

    Dalam Java default, BUKAN kata kunci pengubah akses. Jika anggota kelas dinyatakan tanpa kata kunci pengubah akses maka dalam hal ini dianggap sebagai anggota default. Anggota kelas default selalu tersedia untuk anggota kelas paket yang sama. Tetapi anggota kelas paket luar TIDAK dapat mengakses anggota kelas standar bahkan jika kelas luar adalah subkelas tidak seperti anggota yang dilindungi

  • pribadi

    Jika anggota kelas dideklarasikan dengan kata kunci yang diproteksi maka dalam hal ini HANYA tersedia untuk anggota kelas yang sama

alexvipul
sumber
-1

Access Specifiers in Java: Ada 4 specifier akses di java, yaitu private, package-private (default), protected dan public dalam meningkatkan urutan akses.

Pribadi : Ketika Anda mengembangkan beberapa kelas dan Anda ingin anggota kelas ini tidak diekspos di luar kelas ini maka Anda harus mendeklarasikannya sebagai pribadi. anggota pribadi hanya dapat diakses di kelas di mana mereka didefinisikan yaitu kelas terlampir. anggota pribadi dapat diakses pada referensi 'ini' dan juga pada instance kelas lain yang melampirkan anggota ini, tetapi hanya dalam definisi kelas ini.

Package-private (default) : Specifier akses ini akan menyediakan akses yang ditentukan oleh specifier akses pribadi selain akses yang dijelaskan di bawah ini.

Ketika Anda mengembangkan beberapa paket dan karenanya beberapa kelas (katakanlah Class1) di dalamnya, Anda dapat menggunakan specifier akses default (tidak perlu disebutkan secara eksplisit), untuk mengekspos anggota dalam kelas, ke kelas lain dalam paket Anda (yang sama). Di kelas-kelas lain ini (dalam paket yang sama), Anda dapat mengakses anggota standar ini dengan instance Class1. Anda juga dapat mengakses anggota standar ini dalam subkelas Class1, katakanlah Class2 (pada referensi ini atau pada instance dari Class1 atau pada instance dari Class2).

Pada dasarnya, dalam paket yang sama Anda dapat mengakses anggota default pada instance dari kelas secara langsung atau pada referensi 'ini' di subkelas.

dilindungi : Penentu akses ini akan menyediakan akses yang ditentukan oleh penentu akses akses pribadi selain akses yang dijelaskan di bawah ini.

Ketika Anda mengembangkan beberapa paket dan karenanya beberapa kelas (katakanlah Class1) di dalamnya, maka Anda harus menggunakan specifier akses yang dilindungi untuk anggota data dalam Class1 jika Anda tidak ingin anggota ini diakses di luar paket Anda (misalnya dalam paket konsumen dari paket Anda yaitu klien yang menggunakan API Anda) secara umum, tetapi Anda ingin membuat pengecualian dan mengizinkan akses ke anggota ini hanya jika klien menulis kelas katakanlah Class2 yang memperluas Class1. Jadi, secara umum, anggota yang dilindungi akan dapat diakses pada referensi 'ini' di kelas turunan yaitu Class2 dan juga pada contoh eksplisit Class2.

Tolong dicatat:

  1. Anda tidak akan dapat mengakses anggota Class1 yang dilindungi dan diwarisi, jika Anda mencoba mengaksesnya secara eksplisit dari Class1, meskipun ia diwariskan di dalamnya.
  2. Ketika Anda menulis class3 Class3 lain di dalam paket yang sama / berbeda yang memperluas Class2, anggota yang dilindungi dari Class1 akan dapat diakses pada referensi ini dan juga pada instance eksplisit Class3. Ini akan berlaku untuk setiap hierarki yang diperluas yaitu anggota yang dilindungi masih dapat diakses pada referensi ini atau instance dari kelas yang diperluas. Perhatikan bahwa di Class3, jika Anda membuat instance dari Class2 maka Anda tidak akan dapat mengakses anggota yang dilindungi dari Class1 meskipun itu diwarisi.

Jadi intinya adalah, anggota yang dilindungi dapat diakses dalam paket lain, hanya jika beberapa kelas dari paket lain ini, memperluas kelas yang melampirkan anggota yang dilindungi ini dan anggota yang dilindungi diakses pada referensi 'ini' atau contoh eksplisit dari kelas tambahan, dalam definisi perpanjangan kelas.

publik : Specifier akses ini akan menyediakan akses yang ditentukan oleh specifier akses yang dilindungi selain akses yang dijelaskan di bawah ini.

Ketika Anda mengembangkan beberapa paket dan karenanya beberapa kelas (katakanlah Class1) di dalamnya, maka Anda harus menggunakan specifier akses publik untuk anggota data dalam Class1 jika Anda ingin anggota ini dapat diakses dalam paket lain misalnya Class1 dibuat di beberapa kelas lain paket. Pada dasarnya specifier akses ini harus digunakan ketika Anda bermaksud untuk mengekspos anggota data Anda ke dunia tanpa syarat apa pun.

Tushar Baviskar
sumber