Acesso a um atributo private sem gerar erro de compilação!

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?

Obrigado!

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

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.

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

}[/code]

Att

Foi mal galera agora que vi que a duvida seria da ultima linha da classe A, e não do método main.

Att.