Privado Java Acesso ao Portal
-
21-08-2019 - |
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
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.
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.