Dúvida básica!

No codigo abaixo já rodei e mostrou branco …
String não é tipo primitivo certo ??? não entendi porque mostrou branco e não verde ???

public class TestaString {
public static void mudaCor(String cor) {
cor = “verde”;
}

public static void main(String[] args) {
String cor = new String(“branco”);
mudaCor(cor);
System.out.println(cor);
}
}

Abraço, Valmir

Veja o seu Metodo Main!

public static void main(String[] args) {
String cor = new String("branco"); //aqui você cria a 'branco'
mudaCor(cor); // aqui voce muda em uma funcao | não fara diferenca alguma
System.out.println(cor); // aqui você mostra branco
}

Passagem de parametro em Java é por VALOR!
apenas se for um Array ou uma variavel estatica você conseguira mudar…
*segue um exemplo com variavel estatica espero que voce compreenda…

public class TestaString {
	
	private static String cor;
	
	public	TestaString(){
		cor = new String("branco");
		mudaCor(cor);
		System.out.println(cor);
	}
	
	public void mudaCor(String cor) {
		this.cor = "verde";
	}

	public static void main(String[] args) {
		new TestaString();
		System.exit(0);
	}
}

Exemplo com Array…

public class TestaString {
	
	private String[] cor = {"branco"};
	
	public	TestaString(){
		mudaCor(cor);
		System.out.println(cor[0]);
	}
	
	public void mudaCor(String[] cor) {
		cor[0] = "verde";
	}

	public static void main(String[] args) {
		new TestaString();
		System.exit(0);
	}
}

valeu ? até mais… :smiley:
qualquer duvida GUJ!

Ok !! mas não ficou muito claro…

Se passamos como parâmetro uma variável tipo primitivo, o valor é copiado p/ o argumento do método certo ?

String não é tipo primitivo não é ?? então qdo eu chamo o método passando a String (ou passando um objeto “exemplo Carro”) estou passando o endereço de um lado p/ outro…

Se estou passando o endereço e não o conteúdo como no caso de tipos primitivos me parece que deveria mudar…

Não sei se consegui explicar !!!

Obrigado, Valmir…

Explicando laconicamente eh o seguinte Valmir quando vc chama o método mudaCor vc passa para ele uma cópia da refencia para a String “branco” e no seu método mudaCor vc altera a cópia da referencia para apontar para outro “lugar” (objeto, no caso “verde” - eh importante ressaltar que aqui vc esta alterando a cópia da referencia e nãoo conteudo da variavel de referencia do método main).
E quando o método retorna e vc pede prar imprimir cor esta variável de referencia que não foi alterada (sua cópia foi alterada no método) vai estar armazenando a localização do objeto de String “branco”.
Entendeu :?:

OK !!! Entendi !!!

Eu conseguiria alterar se caso fosse cor.Alteracor(“verde”)…certo ???

Valeu mesmo !!! :smiley:

dae

 vmorikawa, procure utilizar o mínimo possível de variáveis e/ou métodos staticos.

Quanto a passagem por valor ou referência o que acontece é o seguinte.
Passagem de parâmetro por referência:
É passada uma cópia dos bits que representa o objeto. Dessa forma quando alterará-se a referência.As variáveis que referência o objeto
apontam para o mesmo endereço de memória.
Passagem por valor.
É passada uma cópia dos bits da variável. Dessa forma ao se alterar o valor apenas a cópia será alterada.
Isso se dá com as variáveis primitivas e wrappers.

 Creio que o que confundio vc foi a questão do String s = "valor". Na verdade quando se refere-se a valores String a coisa é um pouco diferente.
 Por exemplo quando vc faz,
 [code]
    String s = "valor";
 [/code]
 vc tem uma posição na memória com o valor: "valor". 
 Se vc fizer, 
 [code]
 s = "valor2";
 [/code]
 vc terá 2 posições na memória com: "valor" e "valor2" até o garbage passar :).
 
 Caso vc crie outra variável String como em: 
 [code]
 String s = "valor2";
 [/code]
  está usará aquele valor já na memória.
 Se vc faz o seguinte:
 [code]
  String s = new String("valor2");
 [/code] 
 vc força a criação de outra posição na memória.

O código abaixo utiliza passagem de parâmetro por referência:

public class TesteReferencia {

    public static void main( String[] args ) {
        new TesteReferencia().start();
    }
    
    private void start() {
        MinhaCor minhaCor = new MinhaCor("Vede");
        System.out.println(minhaCor);
        
        this.mudaCor(minhaCor);
        System.out.println(minhaCor);
    }
    
    private void mudaCor(MinhaCor minhaCor) {
        minhaCor.setCor("Branco");
    }
    
    class MinhaCor {
        
        public MinhaCor(String cor) {
            this.cor = cor;
        }
        
        private String cor;
        
        public String getCor() {
            return this.cor;
        }
        
        public void setCor(String cor) {
            this.cor = cor;
        }
        
        public String toString() {
            return this.cor;
        }
    }
}