Pergunta super simples!

6 respostas
A

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

}

6 Respostas

hugosg

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

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".
}
}

Reescrevendo para que aconteça oq vc quer.

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

}
}
A
hugosg:
Primeiro que vc devia ter usado a tag de código pra postar, mas já foi né, vamos aos detalhes.
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".
}
}

Reescrevendo para que aconteça oq vc quer.

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

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

A

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
}  
}
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:
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".
   }  
}

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:

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"
   }  
}
A
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:
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".
   }  
}

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:

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"
   }  
}

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?

ViniGodoy

É 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:

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!
}
Criado 2 de setembro de 2010
Ultima resposta 2 de set. de 2010
Respostas 6
Participantes 4