O acesso de membro “privado do pacote” não é sinônimo de acesso padrão (sem modificador)?

94

Estou um pouco confuso com o termo "pacote privado" que algumas documentações usam, junto com o uso de "acesso padrão". O acesso privado ao pacote e o acesso padrão não são sinônimos de protegido?

TurtleToes
fonte
7
Então, não há nenhuma palavra-chave para expressar o acesso privado ao pacote? Está apenas implícito ao não especificar o modificador de acesso?
TurtleToes
5
TurtleToes, isso mesmo, e isso pode ser um pouco confuso no Java 8, já que é realmente possível colocar o defaultmodificador na frente dos métodos (de interface). Mas isso não é um modificador de acesso! Todos os modificadores de acesso e seus escopos são visualizados claramente nesta tabela .
aioobe
1
você também pode verificar a tabela do tutorial em docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

Respostas:

136

Sim, é quase o mesmo. O modificador protegido especifica que o membro só pode ser acessado dentro de seu próprio pacote (como com package-private) e, além disso , por uma subclasse de sua classe em outro pacote.

Luciano Fiandesio
fonte
Houve muitas respostas boas aqui, mas esta explicava de forma simples e
direta
23
É importante notar que o acesso padrão para o membro da interface não é privado de pacote.
Peter Lawrey
1
@PeterLawrey Oh? Qual é o acesso padrão para membros da interface, então?
ArtOfWarfare
8
O padrão para um campo é public static final, para um método é public abstract, para um enum ou anotação é publice para uma classe épublic static
Peter Lawrey
36

O modificador de acesso "padrão" (aquele em que nenhum deles é explicitamente fornecido) é "package-private", o que significa que apenas coisas no mesmo pacote podem acessá-los. No entanto, estar no mesmo pacote não implica nada sobre o relacionamento de herança entre as classes - é puramente uma convenção de nomenclatura.

"Protegido" significa que não apenas as classes no mesmo pacote, mas também as subclasses (independentemente do pacote em que essas subclasses estejam) poderão acessá-lo.

Adrian Petrescu
fonte
bem, seu texto sobre protected está errado .. Instâncias da mesma classe de pacote também podem acessar membros protegidos ..
Gursel Koca
15

O acesso padrão para classes é privado de pacote, entretanto o acesso padrão para membros da interface é público.

por exemplo

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 { }
}

As regras de acesso padrão para interfaces não são as mesmas que para classes.

Peter Lawrey
fonte
3

Acesso privado de pacote e acesso padrão são sinônimos. Um objeto também pode acessar membros protegidos dos objetos cujas classes estão no mesmo pacote. Um objeto também pode acessar membros protegidos de suas superclasses sem uma condição sobre seu pacote. Como um exemplo concreto:

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
fonte
o downvoter poderia explicar o que há de errado com essa explicação? .. exceto palavras ruins ..
Gursel Koca
6
Não sou o downvoter, mas acho que é porque não está certo; um objeto pode acessar membros protegidos de superclasses, independentemente do pacote.
Adrian Petrescu
1

'Pacote privado' e acesso padrão são os mesmos. Em versões anteriores do compilador por volta de 1.1.2 / 3, 'pacote' era um modificador permitido, mas ignorado, significando o mesmo que nenhum modificador, ou seja, 'pacote privado'. Pouco depois, houve uma moda passageira de colocar /*package*/(como um comentário) em tais situações. Da mesma forma, naquela época, você poderia declarar coisas como classes sincronizadas, embora novamente não houvesse nenhum efeito semântico real.

Nenhum deles é o mesmo que 'protegido', que se estende a classes derivadas em outros pacotes.

Marquês de Lorne
fonte
0

Da especificação da linguagem Java

  • 6.6.5 Exemplo: Campos, métodos e construtores de acesso padrão Se nenhum dos modificadores de acesso público, protegido ou privado for especificado, um membro da classe ou construtor está acessível em todo o pacote que contém a declaração da classe na qual a classe membro é declarado, mas o membro da classe ou construtor não está acessível em nenhum outro pacote.

Se uma classe pública tem um método ou construtor com acesso padrão, então este método ou construtor não é acessível ou herdado por uma subclasse declarada fora deste pacote

Programador Morto
fonte
2
Mas e quanto a "pacote privado". Isso não está no JLS.
Tom Hawtin - tackline
-1

default e package-private são os mesmos, o que significa que podem ser usados ​​por qualquer classe até que estejam no mesmo pacote.

O termo pacote-privado , na verdade, é denominado pelo significado de modificador privado como privado significa que ele está disponível apenas na mesma classe e nenhuma outra classe ou subclasse pode acessá-lo dentro do mesmo pacote ou sem.

Portanto, pacote privado significa o mesmo que padrão .

aayush shah
fonte