Saya agak bingung dengan istilah "paket pribadi" yang digunakan beberapa dokumentasi, bersama dengan penggunaan "akses default". Bukankah akses paket-pribadi dan default sama-sama identik dengan dilindungi?
Saya agak bingung dengan istilah "paket pribadi" yang digunakan beberapa dokumentasi, bersama dengan penggunaan "akses default". Bukankah akses paket-pribadi dan default sama-sama identik dengan dilindungi?
Jawaban:
Ya, hampir sama. Modifier yang dilindungi menetapkan bahwa anggota hanya dapat diakses di dalam paketnya sendiri (seperti paket-private) dan, sebagai tambahan , oleh subkelas kelasnya di paket lain.
public static final
, untuk metode adalah public abstract
, untuk enum atau anotasi adalah public
dan untuk kelas itupublic static
Pengubah akses "default" (yang tidak secara eksplisit diberikan) adalah "package-private", yang berarti hanya hal-hal dalam paket yang sama yang dapat mengaksesnya. Namun, berada dalam paket yang sama tidak menyiratkan apa pun tentang hubungan pewarisan antar kelas - ini murni konvensi penamaan.
"Dilindungi" berarti bahwa tidak hanya kelas dalam paket yang sama, tetapi juga subkelas (terlepas dari paket mana subkelas itu berada) akan dapat mengaksesnya.
Akses default untuk kelas adalah paket-privat, namun akses default untuk antarmuka anggota adalah publik.
misalnya
public interface I {
int A = 1;
// same as
public static final int A = 1;
void method();
// same as
public abstract void method();
class C { }
// same as
public static class C { }
}
Aturan akses default untuk antarmuka tidak sama dengan kelas.
Akses paket-pribadi dan default adalah sinonim. Sebuah objek juga dapat mengakses anggota yang dilindungi dari objek yang kelasnya berada dalam paket yang sama. Sebuah objek juga dapat mengakses anggota superkelasnya yang dilindungi tanpa kondisi tentang paketnya. Sebagai contoh konkret:
package ab;
class A {
protected void foo() {}
void dd(){}
}
class C {
void aa(){
A a = new A();
a.foo(); //legal
a.dd(); //legal
}
}
package sub;
class D extends A{
void ac(){
foo(); //legal ..
dd(); //illegal.. because dd has default access..
}
class E {
void ee(){
A a = new A();
a.foo(); //illegal
a.dd(); //illegal
}
'Paket pribadi' dan akses defaultnya sama. Pada rilis awal kompilator sekitar 1.1.2 / 3, 'package' adalah pengubah yang diizinkan, tetapi diabaikan, artinya sama dengan tanpa pengubah, yaitu 'package private'. Tak lama kemudian, ada cara yang berumur pendek untuk menempatkan /*package*/
(sebagai komentar) dalam situasi seperti itu. Demikian pula pada saat itu Anda dapat mendeklarasikan hal-hal seperti kelas tersinkronisasi, meskipun sekali lagi tidak ada efek semantik yang sebenarnya.
Tak satu pun dari mereka adalah sama dengan 'dilindungi', yang meluas ke kelas turunan dalam paket lain.
- 6.6.5 Contoh: Bidang, Metode, dan Konstruktor Akses Default Jika tidak ada pengubah akses publik, dilindungi, atau pribadi yang ditentukan, anggota kelas atau konstruktor dapat diakses di seluruh paket yang berisi deklarasi kelas di mana kelas tersebut anggota dideklarasikan, tetapi anggota kelas atau konstruktor tidak dapat diakses di paket lain.
Jika kelas publik memiliki metode atau konstruktor dengan akses default, maka metode atau konstruktor ini tidak dapat diakses atau diwarisi oleh subkelas yang dideklarasikan di luar paket ini
default dan package-private keduanya sama, yang berarti keduanya dapat digunakan oleh semua kelas sampai keduanya berada dalam paket yang sama.
Istilah paket-privat , sebenarnya, diistilahkan dengan arti pengubah privat sebagai privat artinya ini hanya tersedia di kelas yang sama dan tidak ada kelas atau subkelas lain yang dapat mengaksesnya dalam paket yang sama atau tanpa.
Karenanya paket-pribadi berarti sama dengan default .