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

6 respostas
T

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!

6 Respostas

Filipe_Chagas

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

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

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

A

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

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

Att

A

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

Att.

Criado 11 de janeiro de 2010
Ultima resposta 12 de jan. de 2010
Respostas 6
Participantes 5