Di Jawa, apakah ada aturan yang jelas tentang kapan harus menggunakan masing-masing pengubah akses, yaitu default (paket privat) public
,, protected
dan private
, saat membuat class
dan interface
dan berurusan dengan warisan?
3171
private
bersembunyi dari kelas lain dalam paket.public
mengekspos ke kelas di luar paket.protected
adalah versipublic
terbatas hanya untuk subclass.protected
membuat metode ini juga dapat diakses dari seluruh paket. Kebodohan dalam model visibilitas Jawa ini mematahkan tujuanprotected
.protected
. Sebagai pengubah akses , yangprotected
dilakukan hanyalah mengekspos ke subkelas di luar paket.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. )protected-package
sektor , katakanlah, untuk kasus-kasus langka di mana kita benar-benar membutuhkannya, sehinggaprotected
setara dengan versi C ++ yang dilindungi.Jawaban:
Tutorial resmi mungkin bermanfaat bagi Anda.
sumber
private
anggota bahkan dapat dilihat / digunakan oleh metode kelas / statis dalam file sumber yang sama.MyClass
dan saya lakukan,AnotherClass extends MyClass
saya akan memiliki akses ke semua metode dan properti publik yang dilindungi dari dalamAnotherClass
. Jika saya melakukannyaMyClass myClass = new MyClass();
diAnotherClass
suatu 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.protected
(yang sebenarnya cukup sulit untuk dipahami sepenuhnya - kebanyakan orang yang berpikir mereka tahu apaprotected
artinya 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?(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.
sumber
friend
bagus 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.Berikut adalah versi tabel yang lebih baik, yang juga menyertakan kolom untuk modul.
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:
long internalCounter
mungkin harus pribadi karena dapat diubah dan detail implementasi.void beforeRender()
Metode internal yang disebut tepat sebelum rendering dan digunakan sebagai hook di subclass harus dilindungi.void saveGame(File dst)
metode yang disebut dari kode GUI harus publik.(*) Apa sebenarnya enkapsulasi?
sumber
sumber
protected
pengubah 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 .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.
sumber
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?
private
: Hanya jika anggota didefinisikan dalam kelas yang sama dengan kode panggilan.protected
: Paket yang sama, atau jika anggota didefinisikan dalam kelas super kelas yang berisi kode panggilan.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
public
paket dan pribadi yang diizinkan. Pilihan desain ini mungkin karenaprotected
danprivate
akan 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
artinya
public
menyediakan akses terbanyak,private
paling 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
private[this]
.)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:
Output kompiler:
Beberapa pertanyaan terkait:
sumber
Sebagai aturan praktis:
private
: ruang lingkup kelas.default
(ataupackage-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:
maka kita memiliki tabel sederhana ini:
sumber
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.private
: dapat diakses hanya dalam kelas yang sama.sumber
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;
Father
danSon
, masing-masing dalam paketnya sendiri:Mari tambahkan metode yang dilindungi
foo()
keFather
.Metode
foo()
ini dapat dipanggil dalam 4 konteks:Di dalam kelas yang terletak di paket yang sama di mana
foo()
didefinisikan (fatherpackage
):Di dalam subkelas, pada instance saat ini melalui
this
atausuper
:Pada referensi yang tipenya kelas yang sama:
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]:Situasi berikut tidak valid.
Pada referensi yang jenisnya adalah kelas induk dan itu berada di luar paket di mana
foo()
didefinisikan (fatherpackage
):Non-subclass di dalam paket subclass (Subclass mewarisi anggota yang dilindungi dari induknya, dan itu membuat mereka pribadi untuk non-subclass):
sumber
Object#clone()
adalah contohprotected
anggota.super.foo()
dan situasi tidak valid pertamaf.foo()
?protected
. Sayangnya, semua jawaban lain di halaman ini yang mendefinisikannyaprotected
agak salah.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.
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
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.
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.
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
sumber
Perbedaannya dapat ditemukan dalam tautan yang sudah disediakan tetapi yang digunakan biasanya merujuk pada "Prinsip Pengetahuan Paling Sedikit". Hanya izinkan visibilitas terendah yang dibutuhkan.
sumber
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.
sumber
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.
sumber
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,
Akses ini lebih terbatas daripada publik dan dilindungi, tetapi kurang dibatasi daripada pribadi.
2. Umum
Dapat diakses dari mana saja. (Akses Global)
Sebagai contoh,
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,
4. Dilindungi
Dapat diakses hanya untuk kelas-kelas dalam paket yang sama dan ke subclass
Sebagai contoh,
sumber
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.
sumber
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:
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:
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:
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.
sumber
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. ....
sumber
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.
sumber
Catatan: Ini hanya suplemen untuk jawaban yang diterima.
Ini terkait dengan Java Access Modifiers .
Dari Java Access Modifiers :
Dari Mengontrol Akses ke Anggota tutorial Kelas :
sumber
Publik Dilindungi Default dan pribadi adalah pengubah akses.
Mereka dimaksudkan untuk enkapsulasi, atau menyembunyikan dan menunjukkan isi kelas.
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.
sumber
Default
bukan pengubah akses, dan dua lainnya salah eja.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!
sumber
Ketika Anda memikirkan pengubah akses, pikirkan saja dengan cara ini (berlaku untuk variabel dan metode ):
public
-> dapat diakses dari mana sajaprivate
-> hanya dapat diakses dalam kelas yang sama tempat dideklarasikanSekarang kebingungan muncul ketika datang ke
default
danprotected
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 daripadadefault
dan terpisah dari kelas paket yang sama dapat diakses oleh sub kelas di luar paket itu dinyatakan.sumber
Akses Java memodifikasi yang dapat Anda gunakan
Akses pengubah bisa berlaku untuk
class
,field
[Tentang] ,method
. Coba akses, subkelas, atau abaikan ini.field
ataumethod
melalui aclass
.class
Pengubah akses penerus (subclass) dapat berupa apa saja.method
Pengubah akses pengganti (harus diganti) harus sama atau perluas diperluasKelas tingkat atas (ruang lingkup tingkat pertama) dapat
public
dandefault
.Nested class
[Tentang] dapat memilikinyapackage
tidak berlaku untuk hirarki paketPengubah akses cepat
sumber
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.
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 ...).
sumber
Berikut blok diagram menjelaskan bagaimana anggota data kelas dasar yang diwariskan ketika diturunkan kelas modus akses pribadi .
Catatan: Mendeklarasikan anggota data dengan specifier akses pribadi dikenal sebagai penyembunyian data.
Sumber: Penentu Akses - Pribadi, Publik dan Dilindungi
sumber
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
sumber
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
sumber
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:
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.
sumber