public static void main(String args[]) {
String str;
str = “Modelo 1 de String”;
setStr(str);
System.out.println(str); //Vc está mandando imprimir str, ou seja “Modelo 1 de String”.
}
}
[/code]
Reescrevendo para que aconteça oq vc quer.
[code]public class StringTest {
static void setStr(String setstring) {
setstring = “Modelo 2 de String”;
System.out.println(setstring); //Imprimindo a partir do método funcionará.
}
public static void main(String args[]) {
String str;
str = “Modelo 1 de String”;
setStr(str);
public static void main(String args[]) {
String str;
str = “Modelo 1 de String”;
setStr(str);
System.out.println(str); //Vc está mandando imprimir str, ou seja “Modelo 1 de String”.
}
}
[/code]
Reescrevendo para que aconteça oq vc quer.
[code]public class StringTest {
static void setStr(String setstring) {
str = “Modelo 2 de String”; //Modificando o valor de str ao invés de setstring como vc estava fazendo, agora funciona!
}
public static void main(String args[]) {
String str;
str = “Modelo 1 de String”;
setStr(str);
System.out.println(str);
}
}
[/code][/quote]
ueh, mas do seu jeito se eu fosse usar o metodo setStr pra configurar outra String ele nao vai funcionar, soh vai funcionar pra string str. pq do jeito q eu fiz ta errado?
imaginei q o setstring seria convertido em str ja que eu chamei a função setStr(str) e ela foi declarada setStr(String setstring).
Você deve lembrar que o java trabalha apenas com referências, e passa parâmetros apenas por valor.
Então veja o que acontece:
[code]public class StringTest {
static void setStr(String setstring) { //3. Aqui você faz uma cópia da referência. A cópia também aponta para “Modelo 1 de String”;
//4. A cópia da referência agora aponta para Modelo 2 de String. A referência original não é alterada.
setstring = “Modelo 2 de String”;
} //A cópia da referência é descartada.
public static void main(String args[]) {
String str; //1. Aqui vc cria uma referência
str = “Modelo 1 de String”; //2. E faz ela a apontar para o valor “Modelo 1 de String”
setStr(str);
System.out.println(str); //4.Aqui você manda imprimir a referência original, que ainda contém “Modelo 1 de String”.
}
} [/code]
Como tanto a cópia como a referência apontam para o mesmo lugar num método, você poderia alterar o objeto desde que ele possuisse um método set para isso. Não é o caso da classe String, que é imutável, mas poderia ser, por exemplo, da classe String Builder:
[code]public class StringTest {
static void setStr(StringBuilder setstring) { //3. Aqui você faz uma cópia da referência. A cópia também aponta o string builder
setstring.clear(); //3.1. Alteramos o string builder. A referência aponta para o mesmo que a variável original aponta
setString.append(“Modelo 2 de referência”); //Então ambos são modificados.
} //A cópia da referência é descartada, mas o objeto que ela aponta não.
public static void main(String args[]) {
StringBuilder str = new StringBuilder(); //1. Aqui vc cria uma referência
str.append(“Modelo 1 de String”); //2. E faz ela a apontar para o valor “Modelo 1 de String”
setStr(str);
System.out.println(str.toString()); //4.Aqui você manda imprimir a referência original, que aponta para “Modelo 2 de String”
}
} [/code]
[quote=ViniGodoy]Você deve lembrar que o java trabalha apenas com referências, e passa parâmetros apenas por valor.
Então veja o que acontece:
[code]public class StringTest {
static void setStr(String setstring) { //3. Aqui você faz uma cópia da referência. A cópia também aponta para “Modelo 1 de String”;
//4. A cópia da referência agora aponta para Modelo 2 de String. A referência original não é alterada.
setstring = “Modelo 2 de String”;
} //A cópia da referência é descartada.
public static void main(String args[]) {
String str; //1. Aqui vc cria uma referência
str = “Modelo 1 de String”; //2. E faz ela a apontar para o valor “Modelo 1 de String”
setStr(str);
System.out.println(str); //4.Aqui você manda imprimir a referência original, que ainda contém “Modelo 1 de String”.
}
} [/code]
Como tanto a cópia como a referência apontam para o mesmo lugar num método, você poderia alterar o objeto desde que ele possuisse um método set para isso. Não é o caso da classe String, que é imutável, mas poderia ser, por exemplo, da classe String Builder:
[code]public class StringTest {
static void setStr(StringBuilder setstring) { //3. Aqui você faz uma cópia da referência. A cópia também aponta o string builder
setstring.clear(); //3.1. Alteramos o string builder. A referência aponta para o mesmo que a variável original aponta
setString.append(“Modelo 2 de referência”); //Então ambos são modificados.
} //A cópia da referência é descartada, mas o objeto que ela aponta não.
public static void main(String args[]) {
StringBuilder str = new StringBuilder(); //1. Aqui vc cria uma referência
str.append(“Modelo 1 de String”); //2. E faz ela a apontar para o valor “Modelo 1 de String”
setStr(str);
System.out.println(str.toString()); //4.Aqui você manda imprimir a referência original, que aponta para “Modelo 2 de String”
}
} [/code]
[/quote]
aqui ta dizendo q o metodo clear da classe StringBuilder não existe…
de qualquer maneira eu entendi meu erro, muito obrigado!!!
então sempre q eu quiser alterar uma String através de um método eu tenho que usar a StringBuilder?
Pois isso recairia no mesmo problema que você teve. Você criaria um novo StringBuilder, alteraria a cópia da referência, mas a referência original continuaria apontando para o StringBuilder antigo.
Você só pode alterar objetos mutáveis por parâmetro. A string não é esse caso. Porém, é muito raro precisar alterar Strings dessa forma. Se você vai trabalhar com strings intensamente (concatenando e alterando seu conteúdo o tempo todo), aí o melhor é usar o StringBuilder mesmo.
Agora, note que sua String pode estar dentro de um objeto, e você poderia alterar a String do objeto normalmente:
[code]public class Cliente {
public String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
public static alteraNome(Cliente cliente) {
cliente.setNome(“Teste!”);
}
public static void main(String args[]) {
Cliente cliente = new Cliente();
cliente.setNome(“Novo”);
alteraNome(cliente);
System.out.println(cliente.getNome()); //Imprime Teste!
}
[/code]