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);
}
}
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…
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 :?:
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;
}
}
}