“”
c3 não chega a ser um objeto e sim uma referência a um objeto, que receberá null. c1 e c2 são referências para objetos iniciados com um objeto. O objeto que c1 referencia é que está qualificado para garbage collection no momento em que c1=null.
eu tb li o livro e tb vi esse exercicio.
Eu continuo não entendendo.
c3 recebe null do método go().
Não entendi tb pq 2 … 1 eu sei q é do Short, isso eu concordo.
Mas o c3 naum ser NULL q naum entra na minha cabeça.
Muito Obrigado
Ricardo
E pq c2 nao vira null ???
c2 não vira null porque em Java as passagens são sempre por valor e não por referência (“pass by value” e não “pass by reference”), daí que o método “go” recebe uma “cópia” da referência à c2, de modo que ele pode “usar” o objeto referenciado por c2, mas mesmo que ele faça sua referência = null, não quer dizer que c2 tenha perdido sua referência.
Pense assim: c2 é um “controle remoto” para um objeto do tipo CardBoard. Enquanto existir um controle remoto que possa comandar um determinado objeto, ele nunca será coletado pelo Garbage Collector. Quando você faz metodo(c2), você não entrega seu controle remoto, e sim cria uma cópia do controle para ser utilizado dentro do metodo. Não importa que dentro do método o controle seja anulado, pois era somente uma cópia. Isso é “pass by value”.
E c3 é null. Mas não tem nem nunca teve objeto associado a ele para ser coletado. Sempre foi null.
E quanto a isso:
[code]
static List go(List list) {
list.add(new Object());
return list;
}
public static void main(String[] args) {
List l = new ArrayList();
go(l);
System.out.println(l.size());
}[/code]
A saida é 1, ou seja, ele alterou a referencia.
Não, não alterou a referência. Alterou o objeto ArrayList. Como eu falei, a referência é um controle remoto, com ele você pode alterar o canal, aumentar o volume da TV, mas por ser uma “cópia” do controle remoto, não adianta você anulá-lo (ou jogá-lo fora), pois o controle original está lá. Ou seja, a referência original está lá, na variável.
Não adianta fazer list=null dentro do método, pois em l a referência continua.
"
Bom dia à todos!!!
fkimura,
Parabéns pelas explicações, show!!!
Vlw, me clareou legal sobre o garbage.
Abs,
Vlw!!!
Estou estudando pelo livro.
A primeira vez que li errei as mesmas coisas, mas agora na segunda já não errei mais, pois pratiquei um pouco em um projeto e ficou bem claro. Mas é normal ter alguma dificuldade na primeira leitura ( se estiver nela ).
Abraço.
Pra essas dúvidas eu recomendo o outro livro da Kathy Sierra “Head First Java”, em portugues “Use a cabeça” ou algo assim. Foi de lá que eu “peguei” o exemplo do controle remoto, me ajuda bastante a explicar nas aulas quando os alunos não entendem o pass-by-value.
O livro procura ser bem didático, principalmente nas coisas mais complicadas. O site dela tb é bom: javaranch.com, tem dicas para certificação e um forum de discussão (mas tudo em inglês).
Abraço e boa sorte nos estudos.
O comentário do fkimura é muito válido.
Pois um amigo estava com este livro da Kathy Sierra “Head First Java” e é muito bem exemplificado e didático.
Abraço a todos.
olá fkimura,
Eu entendi sua explicação sobre passar uma cópia da referência para o método.
Mas eu vi q existe alguns casos q c eu passar a referência do objeto … eu consigo manipular alguns atributos do objeto passado para o método.
A minha dúvida é: quando eu posso fazer isso ??? Manipular os atributos de um objeto dentro de um método.
Muito Obrigado
ricardo
Ricardo, pelo que eu entendi do que você está perguntando, a resposta é:
Você sempre irá poder acessar os métodos e atributos públicos (ou de acesso compatível) de um objeto cuja referência lhe foi passada via método. Pense nos atributos e métodos como sendo os botões do controle remoto que você pede como parametro no método. No exemplo com List, como você pede um List como parâmetro, você poderá acessar todos os métodos declarados na interface List, e esses métodos poderão eventualmente alterar o objeto ArrayList cuja referência foi passada.
O que não adianta é “jogar o controle fora” (fazer a referência = null), pois não te deram o controle, e sim uma cópia do controle (pass-by-value).
A única coisa que vai restringir é o acesso (private,default, protected ou public) do método ou atributo.
Eu vi esse exemplo do q eu quis dizer em uma apostila.
Esse é um exemplo
Carro meuCarro = new Carro( );
meuCarro.modelo = "Gol";
meuCarro.cor = "preto";
meuCarro.motor = "1.0 16v";
System.out.println( meuCarro.modelo );
realidade( meuCarro );
System.out.println( meuCarro.modelo );
sonho( meuCarro );
System.out.println( meuCarro.modelo );
void realidade( Carro c ) {
// eu quero que ele mude, mas não muda!
// c nunca será alterado fora do método
Carro c2 = new Carro( );
c2.modelo = "Porsche";
c2.cor = "prata";
c2.motor = "4.0";
c = c2;
}
void sonho( Carro c ) {
// aqui alteramos o estado do objetos e
// reflete fora do método, mas é só um sonho
c.modelo = "Porsche";
c.cor = "prata";
c.motor = "4.0";
}
Não entendi muito o pq eu consigo mudar o objeto dentro de um método e no outro naum.
Muito Obrigado fkimura
Ricardo
Cada vez que você usa o operador “.” você está “apertando um botão” do “controle remoto”. Cada vez que você faz uma atribuição “=”, você está alterando o controle, e não o objeto.
No método realidade, você recebe a cópia do controle remoto do carro “Gol”, cria outro carro “Porsche” e OUTRO controle remoto, c2. A seguir, faz o seu controle remoto c apontar para o objeto apontado por c2. Mas o controle original meuCarro continua lá, apontando para o “Gol”.
Já no método sonho, você recebe a cópia do controle remoto do “Gol”, e altera os atributos do objeto controlado por ele (utilizando o “.”), ou seja, altera o atributo modelo para “Porsche”. Daí que quando você olhar o objeto via o controle original meuCarro, ele estará alterado.
Mexer no controle (c=algumaCoisa) não adianta, mas mexer no objeto através do controle (c.algumaCoisa) adianta, pois você pode alterar o estado do objeto referenciado por ele.
Espero que tenha entendido.
Valeu pela explicação,
Agora considero completamente esclarecido.
Desenhei no papel e juntamente com sua explicação eu consegui entender esses códigos.
Muito Obrigado pela sua explicação
Ricardo