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