Saya baru saja mulai membaca buku Java dan bertanya-tanya; penentu akses mana yang default, jika tidak ada yang ditentukan?
java
access-specifier
bennedich
sumber
sumber
Jawaban:
Visibilitas default dikenal sebagai "package-private" (meskipun Anda tidak dapat menggunakan ini secara eksplisit), yang berarti kolom tersebut dapat diakses dari dalam paket yang sama dengan kelas tersebut.
Seperti yang ditunjukkan mdma, itu tidak benar untuk anggota antarmuka, yang defaultnya adalah "publik".
Lihat Access Specifiers Java
sumber
Penentu default bergantung pada konteks.
Untuk kelas, dan deklarasi antarmuka, defaultnya adalah paket privat. Ini berada di antara dilindungi dan pribadi, hanya mengizinkan kelas dalam akses paket yang sama. (dilindungi seperti ini, tetapi juga mengizinkan akses ke subclass di luar paket.)
Untuk anggota antarmuka (bidang dan metode), akses defaultnya adalah publik. Tetapi perhatikan bahwa deklarasi antarmuka itu sendiri secara default adalah paket pribadi.
Jika kita kemudian memiliki deklarasi
Kelas yang menggunakan MyInterface2 kemudian dapat melihat field1 dan method1 dari antarmuka super, karena keduanya bersifat publik, meskipun mereka tidak dapat melihat deklarasi MyInterface itu sendiri.
sumber
/* pp */
) hanya nama yang mudah digunakan untuk akses default . Itu bukan nama JLS.Jika tidak ada penentu akses yang diberikan, itu adalah akses tingkat paket (tidak ada penentu eksplisit untuk ini) untuk kelas dan anggota kelas. Metode antarmuka secara implisit bersifat publik.
sumber
Visibilitas default (tanpa kata kunci) adalah paket yang artinya akan tersedia untuk setiap kelas yang terletak di paket yang sama.
Catatan samping yang menarik adalah bahwa protected tidak membatasi visibilitas ke subclass tetapi juga ke kelas lain dalam paket yang sama
sumber
Itu tergantung pada apa benda itu.
Tipe level teratas (yaitu, kelas, enum, antarmuka, dan tipe anotasi yang tidak dideklarasikan di dalam tipe lain) secara default bersifat package-private . ( JLS §6.6.1 )
Di kelas, semua anggota (yang berarti bidang, metode, dan deklarasi tipe bertingkat) dan konstruktor secara default bersifat paket-pribadi . ( JLS §6.6.1 )
Dalam enum, konstruktor bersifat pribadi secara default. Memang, pembuat enum harus pribadi, dan merupakan kesalahan untuk menentukannya sebagai publik atau dilindungi. Konstanta enum selalu publik , dan tidak mengizinkan penentu akses apa pun. Anggota enum lainnya adalah paket-privat secara default. ( JLS §8.9 )
Dalam antarmuka dan tipe anotasi, semua anggota (sekali lagi, itu berarti bidang, metode, dan deklarasi tipe bertingkat) bersifat publik secara default. Memang, anggota antarmuka dan jenis anotasi harus publik, dan merupakan kesalahan untuk menetapkannya sebagai pribadi atau dilindungi. ( JLS §9.3 hingga 9.5 )
Kelas lokal diberi nama kelas yang dideklarasikan di dalam blok metode, konstruktor, atau penginisialisasi. Mereka dicakup ke
{
..}
blok di mana mereka dideklarasikan dan tidak mengizinkan penentu akses apa pun. ( JLS §14.3 ) Dengan menggunakan refleksi, Anda dapat membuat instance kelas lokal dari tempat lain, dan kelas tersebut bersifat pribadi-paket , meskipun saya tidak yakin apakah detail tersebut ada di JLS.Kelas anonim adalah kelas khusus yang dibuat dengan
new
menentukan badan kelas secara langsung dalam ekspresi. ( JLS §15.9.5 ) Sintaksnya tidak mengizinkan penentu akses apa pun. Dengan menggunakan refleksi, Anda dapat membuat instance kelas anonim dari tempat lain, dan keduanya serta konstruktor yang dihasilkan bersifat package-private , meskipun saya tidak yakin apakah detail itu ada di JLS.Instance dan blok penginisialisasi statis tidak memiliki penentu akses pada tingkat bahasa ( JLS §8.6 & 8.7 ), tetapi blok penginisialisasi statis diimplementasikan sebagai metode bernama
<clinit>
( JVMS §2.9 ), sehingga metode harus, secara internal, memiliki beberapa penentu akses. Saya memeriksa kelas yang dikompilasi oleh javac dan oleh kompiler Eclipse menggunakan editor hex dan menemukan bahwa keduanya menghasilkan metode sebagai paket-pribadi . Namun, Anda tidak dapat memanggil<clinit>()
dalam bahasa karena karakter<
dan>
tidak valid dalam nama metode, dan metode refleksi tertanam kuat untuk menolak keberadaannya, jadi secara efektif penentu aksesnya tidak memiliki akses . Metode ini hanya dapat dipanggil oleh VM, selama inisialisasi kelas.Blok penginisialisasi instans tidak dikompilasi sebagai metode terpisah; kode mereka disalin ke setiap konstruktor, sehingga tidak dapat diakses secara individual, bahkan dengan refleksi.sumber
default adalah kata kunci yang digunakan sebagai pengubah akses untuk metode dan variabel.
Menggunakan pengubah akses ini akan membuat kelas, variabel, metode, atau konstruktor Anda dapat diakses dari kelas atau paket sendiri, juga akan disetel jika tidak ada pengubah akses.
jika Anda menggunakan default di antarmuka Anda akan dapat menerapkan metode di sana seperti contoh ini
Namun itu hanya akan bekerja dari versi 8 Java
Dokumentasi Resmi
Pengubah Akses di Java
sumber
Lihat di sini untuk lebih jelasnya. Standarnya tidak ada yang privat / publik / dilindungi, tetapi spesifikasi akses yang sama sekali berbeda. Ini tidak digunakan secara luas, dan saya lebih suka lebih spesifik dalam definisi akses saya.
sumber
penentu akses default adalah paket. Kelas dapat mengakses anggota kelas lain dalam paket yang sama. tetapi di luar paket itu tampak sebagai pribadi
sumber
Berikut adalah kutipan tentang visibilitas level paket dari wawancara dengan James Gosling, pencipta Java:
http://www.artima.com/intv/gosling2P.html
sumber
Perbarui penggunaan kata kunci Java 8
default
: Seperti yang telah dicatat oleh banyak orang. Visibilitas default (tanpa kata kunci)Jangan bingung dengan fitur Java 8 baru ( Metode Default ) yang memungkinkan sebuah antarmuka menyediakan implementasi ketika diberi label dengan
default
kata kunci.Lihat: Pengubah akses
sumber
Ada pengubah akses yang disebut "default" di JAVA, yang memungkinkan pembuatan instance langsung dari entitas itu hanya di dalam paket itu.
Ini tautan yang berguna:
Pengubah / Penentu Akses Java
sumber
Pertama-tama izinkan saya mengatakan satu hal tidak ada istilah seperti "Access specifier" di java. Kita harus menyebut semuanya sebagai "Pengubah". Seperti yang kita ketahui bahwa final, static, synchronized, volatile .... disebut sebagai pengubah, bahkan Publik, pribadi, dilindungi, default, abstrak juga harus disebut sebagai pengubah. Default adalah suatu pengubah dimana keberadaan fisik tidak ada tetapi tidak ada pengubah ditempatkan maka itu harus diperlakukan sebagai pengubah default.
Untuk membenarkan ini, ambil satu contoh:
Outputnya adalah:
Hello Java
Sekarang ubah publik menjadi privat dan lihat kesalahan kompiler apa yang Anda dapatkan: Dikatakan "Modifier privat tidak diizinkan di sini" Kesimpulannya adalah seseorang bisa saja salah atau beberapa tutorial bisa salah tetapi kompiler tidak bisa salah. Jadi kita dapat mengatakan tidak ada istilah penentu akses di java semuanya adalah pengubah.
sumber