Uma Ajudinha para um Iniciante.. ( Referência de Objetos )

Salve amigos do fórum…

Sou novo no ramo do Java… i estou com um probleminha…

eis o link de um post que fiz em outro forum de discussões porem não obtive ajuda ainda…

alguem pode me dar uma maozinha?

http://www.forumweb.com.br/foruns/index.php?s=e88e112f9d1733ae0cf239338e470321&showtopic=75811

Valeu

:grin:

markos.
String é um objeto imutável.
Quando vc faz isso

msg = msg.concat(....

Nessa atribuição, vai retornar uma nova String para msg.
E a anterior que vc criou no main (texto), ainda aponta para a antiga.

Lembre-se que parâmetros sempre são passados como valor, nunca como referência, até mesmo as referências são passadas como valor, se tiver ficado confuso, vou fazer uma analogia, em algumas linguagens, como C existem dois tipos de passagem de parâmetros, por valor e por referência, portanto em C é possível fazer algo assim:

[code]void metodo(int a) {
a = 2;
}

int b = 0;
metodo(b);[/code]

Após a execução desse método o valor da variável b será 0, pois o parâmetro foi passado como valor, ou seja, uma cópia da variável b, não uma referência para a variável b, portanto ao alterar o valor do parâmetro, a variável original não é alterada.

[code]void metodo(int *a) {
*a = 2;
}

int b = 0;
metodo(&b);[/code]

Após a execução desse método o valor da variável b será 2, pois o parâmetro foi passado como referência, ou seja, foi passada a referência para a variável original, e portanto ao alterar o seu valor, a variável original também será alterada.

Porém, em Java não existe passagem de parâmetros por referência, todos os parâmetros são passados como valor, até mesmo as referências, ou seja, ao passar uma variável de objeto como parâmetro, o que será passado é uma cópia da referência ao objeto, não uma referência à variável original.

Ex.:

[code]
void metodo(String m) {
m = “Alterado”;
}

String msg = “Inicial”;

metodo(msg);[/code]

Ao executar esse código existe um objeto String e duas referências para ele, a referência msg, e uma cópia dela chamada m, não adianta alterar m que essa mudança não se reflete em msg, pois são duas variáveis diferentes, o que pode confundir é que se o OBJETO referenciado por elas for alterado, aí sim a mudança se reflete, pois são duas referências para o mesmo objeto. Que é o que acontece com o StringBuffer:

[code]void metodo(StringBuffer m){
m.append(“Alterado”);
}

StringBuffer msg = new StringBuffer(“Inicial”);
metodo(msg);[/code]

Nesse caso haverá uma alteração, porem não no valor da variável mas sim no objeto referenciado por elas.

No caso abaixo por exemplo, não será alterado:

[code]void metodo(StringBuffer m){
m = new StringBuffer(“Alterado”);
}

StringBuffer msg = new StringBuffer(“Inicial”);
metodo(msg);[/code]

E como já foi dito, String é um objeto imutável, portanto, não há como alterar o objeto referenciado pela variável original.

Espero que não tenha ficado muito confuso, se tiver ficado é só falar. :roll:

Entendi… é por isso então que se eu uso o StringBuffer ou o StringBuilder funciona… pq eles são thrade-safe… correto?

Valeu

\o/

Na realidade thread safe não interfere nisso, o que acontece com StringBuffer/StringBuilder é que eles são alteráveis, portanto você pode alterar o objeto sem alterar o valor da variável.

Ex.:

StringBuffer buf = new StringBuffer("Inicial"); buf.append("Alterado");
Nesse caso o objeto foi alterado, mas o valor da variável buf continua o mesmo.

StringBuffer buf = new StringBuffer("Inicial"); buf = new StringBuffer("Alterado");
Nesse caso o objeto não foi alterado, o que foi alterado foi o valor da variável que passou a apontar para um novo objeto.

Porém o tipo String não permite as alterações no objeto como foi feito no primeiro caso com StringBuffer.

markosflavia, tu estás a pensar bem para qualquer objecto… menos para String. A classe String é especial.