Duvida sobre código

Olá a todos…

Sou iniciante em Java e estou estudando não apenas para aprender como também para conseguir a certificação.

Fiz pela primeira vez o simulado CaelumMock e mesmo após ler a resolução da questão abaixo não consegui compreender muito bem.

A resposta para o código é: Imprime x

e a explicação é: Esse teste mostra a possibilidade de acesso à um atributo private que duas instâncias diferentes da mesma classe compartilham

O que é exatamente isso?

name não é um atribudo privado do objeto, no caso de x e de y? Como que um objeto pode acessar o atributo privado de outro objeto?

O que é A(String a)? Isso não é um metodo nem uma classe, como recebe um parametro? A mesma dúvida tenho no comando String name(A a)?

Agradeço desde já.
Abs,
RMello

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

A(String a) { 
    name = a;
}

é um construtor, ele receberá o valor que foi passado na instanciação, ou seja:

           A x = new A("x");    
           A y = new A("y"); 

Sim, mas mesmo assim, ele pode ser acessado se for invocado dentro da propria classe.

Estou ocupado para explicar mais :stuck_out_tongue: Mais qlq duvida poste :smiley:

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

Vamos por partes:

A(String a) {name = a;}//Isso é um construtor String name(A a) { return a.name; }//Isso é um método

Você pode ter ficado confuso por não terem modificadores de acesso explícitos (public, protected, private), mas o primeiro é um construtor e o segundo um método. Ambos com o modificador de acesso default

Se quiser, leia mais sobre isso aqui.

por que ele imprime x? porque o método name imprime o atributo name de qualquer objeto A que for enviado como parâmetro, não sendo necessariamente o atributo dele. Entendeu?

OK!

Referente ao construtor entendi perfeitamente sem dúvidas, agora referente ao medoto

String name(A a) { return a.name; }//Isso é um método  

Vamos ver se entendi:

na comando abaixo é chamado o medoto name que espera como parâmetro um obj do tipo A que neste caso foi passado o obj x, mesmo sendo chamado a partir do obj y, certo?

System.out.println(y.name(x));

depois no método name é retornado o atributo name do obj a.

Como o obj x foi passado como parâmetro podemos dizer que o obj a = x, ou seja a e x apontam para o mesmo obj?

O obj y neste código não está acessando nada de x, ele apenas serve para passar x como parâmetro?

É isso?

então. A é uma classe.

x e y são instâncias.

u método de A está sendo invocado pela instância y enviando x como parâmetro.
mas esse método está acessando um atributo privado de x por y? Não.

O atributo privado é da classe A, independente de ser instância x, y ou z…

a classe A tem acesso ao atributo name, portanto se um A for enviado como parâmetro, o método terá acesso direto aos atributos.

Deu pra entender melhor? até eu me confundi um pouco tentando explicar, não sirvo pra essas coisas, rs.

Isso aqui:

public static void main(String args[ ] )    
       {    
           A x = new A("x");    
           A y = new A("y");    
           System.out.println(y.name(x));    
       }   

Indica que você tem duas referências a determinados objetos, que para este caso, é o mesmo objeto. Mesmo sendo o mesmo objeto, são duas referências distintas. A referência x passou no construtor o valor “x” enquanto a referência y passou o valor em seu construtor, sendo “y”.

Todavia, quem invoca o método name é a referência y, passando como parâmetro o objeto x, que foi instanciando com o valor “x” em seu construtor. O método name pega a referência passada e acessa a variável name do objeto passado, como no caso foi o objeto x, ele vai retornar a String contida em name, que é o “x”. Se ele tivesse feito:

y.name(y)

Ele iria retornar “y”. Conseguiu entender?
Abraços.

Então nel,

acho que entendi…

a instancia x aponta para uma posição de memória 123, onde contém o valor x. Isso foi feito no contrutor de A certo?

Quando x é passado para “a” como parâmetro, faz com que seja criado uma referencie para a mesma posição de memoria de x (posição 123) certo?

portanto a e x reference a mesma posição de memória. Certo?