Dúvida básica!

6 respostas
V

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

6 Respostas

keller

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

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!

V

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…

Java_Vinicius_Machin

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

V

OK !!! Entendi !!!

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

Valeu mesmo !!! :smiley:

F

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,
String s = "valor";
vc tem uma posição na memória com o valor: "valor". Se vc fizer,
s = "valor2";
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:
String s = "valor2";
está usará aquele valor já na memória. Se vc faz o seguinte:
String s = new String("valor2");
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;
        }
    }
}
Criado 16 de janeiro de 2005
Ultima resposta 16 de jan. de 2005
Respostas 6
Participantes 4