ae pessoal, mais um exercício pra vcs q estão estudando, referente a passagem de parametros por referencia, … qual será a saída do programa abaixo :?: não vale rodar o programa heim! na hr da prova vcs não terão o SDK!
[code]
public class Teste {
public static void main( String[] args )
{
Objeto o = new Objeto( "primeiro objeto" );
System.out.println( o.getNome() );
foo( o );
System.out.println( o.getNome() );
}
private static void foo( Objeto o )
{
o = new Objeto( "segundo objeto" );
}
}
class Objeto {
private String nome;
public Objeto()
{
setNome( "Objeto1" );
}
public Objeto( String nome )
{
setNome( nome );
}
public void setNome( String nome )
{
this.nome = nome;
}
Duuhhhhh… MAs se cair só dessas no exame eu vou tirar é 100… hehehe
Reposta:
primeiro objeto
primeiro objeto
Isso acontece pq no método foo, está sendo criado outro objeto com o mesmo nome de objeto criado no método main, mas, agora que fica divertido, eles não são o mesmo objeto… Se no método foo a linha:
o = new Objeto( "segundo objeto" ); // Se essa linha fosse assim:
this.o = new Objeto( "segundo objeto" );
Se fosse a segunda linha no lugar da primeira, aí a resposta seria diferente. Seria, primeiro e depois segundo objeto… Mas como o this não está lá, ele imprime o nome do primeiro objeto duas vezes.
Não. haehaehaeh, ae jeve, o “this.o” não existe, esse Objeto “o” não foi declarado como variavel de instancia, e sim dentro do método main()… não vai da certo não, e outra… se vc compilar com o “this.o”, o compilador retorna erro, pq vc não pode usar a referencia this em métodos estáticos! … e o método foo() é estatico, pra poder ser chamado do método main()… atenção!
…mas tb não tem nada a ver com a variável ter o mesmo nome…, na verdade, todas as variaveis são passadas por valor (primitivos ou objetos), é isso ai… por valor mesmo! oq significa por valor da variável, passar por cópia da variável… não faz diferença se tu ta passando um primitivo ou um objeto, sempre estará passando uma cópia dos bits da variável, então… no q diz respeito a uma variavel primitiva, tu ta passando uma copia dos bits q representam o valor… por ex, se passar um int de valor 3 pro método, estará passando uma cópia dos bits q representam 3, assim, o método chamado obterá sua propria cópia do valor, pra fazer com ela oq quiser…
agora, se tu tiver passando uma variavel de referencia a um objeto, estará passando uma cópia dos bits q representam a referencia a um objeto, assim, o método chamado obterá a sua propria copia da variavel de referencia e fara com ela oq quiser… mas já q duas variaveis de referencia identicas referenciam exatamente o mesmo objeto, sé o metodo chamado alterar o objeto, o chamador perceberá q o objeto q sua variável original referenciou também tera sido alterado.
no exemplo, reatribuir a a variavel local do metodo “o” não reatribuirá a variavel “o” de main(), qnd a execução do método foo() for concluida, dois objetos Objeto terão sido criados, um referenciado pela variavel local do método main() “o”, e outro pela variavel local no método foo() “o”, já q o método foo() possui uma copia da variavel de referencia, tem uma maneira de acessar o objeto “o” original, mas não tem como acessar a variavel de referencia o do método main(), portanto… foo() pode alterar oq seu objeto “o” estiver referenciando, mas não o conteudo real (padrão de bits) deste.
pra não dar muita confusão pra ententer… renomeiem as variaveis “o” de cada método pra “x” e “y” por ex…
O legal é que vc percebe isso qdo altera somente as propriedades do objeto passado… como vc passou a referência, vc altera as propriedades na boa, até que vc tenta alterar o valor da referência, tentando instanciar um novo objeto na mesma referência…
É criado um novo objeto internamente no método, e é perdida a referência ao objeto externo.
Bom, eu acho que sairia
primeiro objeto
primeiro objeto
a não ser que no foo() o cara desse um o.setNome() pra alterar o nome… se não for isso, por favor me expliquem, pq eu li tanta coisa ali em cima mas não disseram o resultado… e eu quero tirar minha certificação tb!!! :lol: