Bukankah akses anggota "paket pribadi" sama dengan akses default (tanpa pengubah)?

94

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?

TurtleToes
sumber
7
Jadi, tidak ada kata kunci apapun untuk express package private access? Ini hanya tersirat dengan tidak menentukan pengubah akses?
TurtleToes
5
TurtleToes, itu benar, dan ini bisa sedikit membingungkan di Java 8, karena sebenarnya mungkin untuk menempatkan defaultpengubah di depan metode (antarmuka). Tapi itu bukan pengubah akses! Semua pengubah akses dan cakupannya divisualisasikan dengan jelas dalam tabel ini .
aioobe
1
Anda juga dapat memeriksa tabel tutorial dari docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

Jawaban:

136

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.

Luciano Fiandesio
sumber
Ada banyak jawaban bagus di sini, tapi yang ini menjelaskannya dengan sederhana dan langsung pada intinya, jadi saya menerimanya
TurtleToes
23
Perlu dicatat bahwa akses default untuk anggota antarmuka bukanlah paket-pribadi.
Peter Lawrey
1
@ PeterLrey Oh? Lalu, apa akses default untuk anggota antarmuka?
ArtOfWarfare
8
Default untuk sebuah field adalah public static final , untuk metode adalah public abstract, untuk enum atau anotasi adalah publicdan untuk kelas itupublic static
Peter Lawrey
36

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.

Adrian Petrescu
sumber
baik kata-kata Anda tentang dilindungi salah .. Contoh kelas paket yang sama juga dapat mengakses anggota yang dilindungi ..
Gursel Koca
15

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.

Peter Lawrey
sumber
3

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     
    }
Gursel Koca
sumber
downvoter dapat menjelaskan apa yang salah dari penjelasan ini? .. kecuali kata-kata yang buruk ..
Gursel Koca
6
Saya bukan downvoter, tapi saya rasa itu karena itu kurang tepat; sebuah objek dapat mengakses anggota superclass yang dilindungi , apa pun paketnya.
Adrian Petrescu
1

'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.

Marquis dari Lorne
sumber
0

Dari Spesifikasi Bahasa Java

  • 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

Programmer Mati
sumber
2
Tapi bagaimana dengan "paket pribadi". Itu tidak ada di JLS.
Tom Hawtin - tackline
-1

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 .

aayush shah
sumber