Pergunta super simples!

pq ele ta imprimindo “Modelo 1 de String” e não “Modelo 2 de String” como eu quero?
onde eu errei?
qual seria o correto?

public class StringTest {

static void setStr(String setstring) {
	setstring = "Modelo 2 de String";
}

public static void main(String args[]) {
	String str;
	str = "Modelo 1 de String";
	setStr(str);
	System.out.println(str);
}

}

Primeiro que vc devia ter usado a tag de código pra postar, mas já foi né, vamos aos detalhes.

[code]public class StringTest {

static void setStr(String setstring) {
setstring = “Modelo 2 de String”;
}

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);

}
}
[/code]

[quote=hugosg]Primeiro que vc devia ter usado a tag de código pra postar, mas já foi né, vamos aos detalhes.

[code]public class StringTest {

static void setStr(String setstring) {
setstring = “Modelo 2 de String”;
}

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).

onde meu raciocinio ta errado?

edit: e do jeito q voce fez nem compilou lol

Você setou o valor no setString, mas você não criou um método para recuperar o valor que você setou.

public class StringTest {  
  
private String valorStr = "Modelo 2 de String";

static void setStr(String setstring) {   
setstring = this.valorStr;  
}  

static String getStr(){
return this.valorStr;
}
  
public static void main(String args[]) {  
String str;  
str = "Modelo 1 de String";  
setStr(str);  
System.out.println(getStr()); //aqui você recupera o valor
}  
}  

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?

É verdade, no lugar do clear tem que usar:

setstring.delete(0, setstring.size());

Note que não adianta fazer:

setstring = new 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]