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.
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? :?
[quote=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? :? [/quote]
Não quebra regra de encapsulamento, basta vc saber organizar corretamente suas classes =)
vc está acessando o atributo privado de forma indireta, e isso vc pode fazer, oque vc não pode fazer é tentar acessar diretamente exemplo:
class XX {
private int x = 0;
}
class YY {
public YY() {
XX x1 = new XX();
//isso não pode
x1.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
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.
public class Test {
public static void main(String args[ ] )
{
A x = new A("x");
A y = new A("y");
System.out.println(y.name); <<<< Isto não funciona, pois o atributo é private
System.out.println(y.name(x));
}
}
class A {
private String name;
A(String a) { name = a; }
String name(A a) { return a.name; }
}
A unica maneira de vc acessar o atributo name, dentro de teste, seria se fosse classe interna, conforme exemplo abaixo
[code]public class Test {
public static void main(String args[ ] ) {
Test.A y = new Test().new A(“y”);
System.out.println(y.name); <<< Aqui acessa sem problema, pois class A agora, é uma classe interna de Test
}
class A {
private String name;
A(String a) { name = a; }
String name(A a) { return a.name; }
}