Pergunta

é o acesso membro privado no nível da classe ou no nível do objeto. Se é no nível do objeto, então o seguinte código não deve compilação

    class PrivateMember {
   private int i;
   public PrivateMember() {
      i = 2;
   }
   public void printI() {
      System.out.println("i is: "+i);
   }
   public void messWithI(PrivateMember t) {
      t.i *= 2;
   }
   public static void main (String args[]) {
      PrivateMember sub = new PrivateMember();
      PrivateMember obj = new PrivateMember();
      obj.printI();
      sub.messWithI(obj);
      obj.printI();
   }
}

Por favor, esclareça se acessando o membro i do obj dentro dos messWithI () da sub é válido

Foi útil?

Solução

Como DevSolar disse, é no (nível superior) nível de classe.

A partir secção 6.6 da especificação de linguagem Java :

Caso contrário, se o membro ou construtor é declarado privado, em seguida, o acesso é permitido se e somente se ocorre dentro do corpo do topo classe de nível (§7.6) que envolve o declaração do membro ou construtor.

Note que não há nenhuma indicação de que ele está restrito aos membros de um objeto particular.

A partir do Java 7, o compilador não permite mais acesso aos membros privados de variáveis ??tipo . Então, se o método tinha uma assinatura como public <T extends PrivateMember> void messWithI(T t) então seria um erro do compilador para o acesso t.i. Isso não mudaria seu cenário em particular, no entanto.

Outras dicas

Note que você não precisa sequer de acesso de nível de fonte para mexer com campos particulares. Usando java.lang.reflect.AccessibleObject.setAccessibe(), todo o código pode acessar todos os membros privados de todos os outros códigos a menos que você especificar uma política de segurança que disallows o.

private não é por si só um recurso de segurança! É meramente um forte indício para outros desenvolvedores que algo é um detalhe de implementação interna que outras partes sobre o código não deve depender.

Nem. Acesso privado tem como escopo a classe de nível superior abrangendo, assim você pode acessar membros particulares de classe diferente na mesma classe de nível superior:

class PrivateAccess {
    static class InnerOne {
        private int value;
    }

    static class InnerTwo {
        int getOne ( InnerOne other ) {
            return other.value;
        }
    }
}

O significado usual de classe meios de acesso que você tem acesso a partes íntimas de outras instâncias do mesmo tipo. Em Java, acesso privado é determinado lexically, não por tipo.

nível

Class. A ideia é que o código de uma classe (mas nada mais) sabe como lidar com objetos dessa classe.

Se você tiver acesso ao código-fonte da classe de qualquer maneira, há pouco sentido em qualquer coisa "esconderijo" de você.

Como os outros, acesso privado, padrão ( "pacote confidencial"), protegido e talvez no módulo JDK 7 são baseados classe (há regras muito estranhas para classes aninhadas herança que eu posso' t lembrar). Mas por quê?

Primeiramente é até métodos que agem como binário (ou mais) operadores. Para a implementação eficiente que muitas vezes exigem ou são mais fáceis de escrever sem ter que usar ou modificar a API pública. Ter um olhar através de implementações de equals - em bom código que você vai encontrar o acesso direto de campos com algumas chamadas de método para this. (O aspecto desempenho deste agora é em grande parte irrelevante com JVMs modernas inlining chamadas comuns, mas a questão da qualidade do código ainda está lá.)

Apenas para adicionar à resposta de DevSolar, eu esperaria messWithI ser estático declarado como tal:

public static void messWithI(PrivateMember t) {
  t.i *= 2;

} Eu tive um tempo difícil até mesmo lendo o que é que você estava tentando fazer sem a dica 'estática' ... E ele também torna mais fácil para responder à sua pergunta original - o que é que os membros privados não são de alcance limitado para apenas a instância em questão.

A mesma página diz, em sub-seção 6.6.8, você também pode encontrar a seguinte declaração:

Um membro da classe privada ou construtor é acessível apenas dentro do corpo da classe nível superior que inclui a declaração do membro ou construtor. Não é herdada por subclasses.

O membro da classe privada cujo acesso avaliamos aqui é i .

messWithI public void () é um método que existe dentro do corpo da classe nível superior, onde i foi declarado, que é, precisamente, PrivateMember .

A sua construção atende a declaração acima, e é por isso que é executado sem problemas.

Thas é outra maneira de dizer o mesmo que Jon e Devsolar.

modificadores de acesso para membros de classe estão relacionados ao local onde o código é escrito, (no qual pacote, e em que classe), independentemente do tipo de membro, o acesso fica concedido:. Um membro da classe ou um membro de instância

Logicamente, você não pode usar um membro de instância de uma classe se você não tiver uma instância da classe, mas isso é uma questão diferente, relacionado com o ciclo de vida do membro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top