Acesso a um atributo private sem gerar erro de compilação!
6 respostas
T
TiagoTC
Alguém poderia me explicar porque esse código não gera erro de compilação?
public class Test
{
public static void main(String args[ ] )
{
A x = new A("x");
A y = new A("y");
System.out.println(y.name(x));
}
}
class A {
private String name;
A(String a) { name = a; }
String name(A a) { return a.name; }
}
Por que é possível fazer “a.name;” na última linha? name não é um atributo privado da classe A?
O fato de estar dentro da própria classe, te faz ser capaz de enxergar os atributos privados.
Parece estranho a princípio. Mas se pensarmos bem, a finalidade de tornar membros de determinada classe privados, é protegê-los de atores externos que podem não saber como manejá-los da maneira adequada. Partindo deste princípio, a própria classe sabe muito bem como tratar seus membros, conhece muito bem seu próprio funcionamento, portanto nada mais natural que poder manejá-los, ainda que privados e sob a custódia de outra instância.
T
TiagoTC
Eu acho muito estranho isso. :-o Pra mim isso quebra completamente a regra básica de encapsulamento…
Quer dizer que sempre que temos uma classe X, caso eu passe um outro objeto também da classe X para algum método ou construtor da classe, eu posso acessar os atributos diretamente? Isso vale sempre? :?
renamed
TiagoTC:
Eu acho muito estranho isso. :-o Pra mim isso quebra completamente a regra básica de encapsulamento…
Quer dizer que sempre que temos uma classe X, caso eu passe um outro objeto também da classe X para algum método ou construtor da classe, eu posso acessar os atributos diretamente? Isso vale sempre? :?
Não quebra regra de encapsulamento, basta vc saber organizar corretamente suas classes =)
V
vmsb11
vc está acessando o atributo privado de forma indireta, e isso vc pode fazer, oque vc não pode fazer é tentar acessar diretamente exemplo:
classXX{privateintx=0;}classYY{publicYY(){XXx1=newXX();//isso não podex1.x=0;}}
lembre-se o recomendável é vc colocar os atributos da classe privado e criar métodos get e set publicos para vc obter dados destes atributos em outras classes
A
Astork
Só um detalhe.
System.out.println(y.name(x));
Está linha está acessando o método name (e não o atributo name), ou seja a nomenclatura está um pouco confusa, o mais correto para o método seria getName();
Outro detalhe, a classe Test, não acessa o atributo privado, tente fazer assim.