Parâmetro por referência

Como eu faço para passar uma variável local de um método, por referência, para outro método?
exemplo:
public class Teste {

		public Teste() {}

		public void alterarErro( String erro ) {
			erro = "Alterei";
		}

		public void mostrarErro() {
			String erro = "Não alterado";
	
			this.alterarErro( erro );
			System.out.println( erro );
		}

		public static void main( String args[] ) {
			Teste teste = new Teste();
			teste.mostrarErro();
		}
	}

Queria que nessa classe, ele alterasse a String erro para “Alterei”, quando chamo o alterarErro, ou seja, passar a String erro, por referência para o método alterarErro. Como eu posso fazer isso?

Em Java não existe passagem por referência… todas as passagens são por valor.

Seu código alterado:

 public class Teste {
   private erro;
public Teste() {}

public void alterarErro() {
erro = "Alterei";
}

public void mostrarErro() {
erro = "Não alterado";

this.alterarErro();
System.out.println( erro );
}

public static void main( String args[] ) {
Teste teste = new Teste();
teste.mostrarErro();
}
} 

Não deu pra entender o que vc quis fazer, pois está alterando o parâmetro que tem a String erro.

Fiz uma alteração para que tenha o resultado que eu acho que vc queira… não seria a melhor solução… só fiz pra vc entender…

Mas assim eu perco o reaproveitamento de código. Eu poderia então, passar um objeto do tipo classe Teste para o método, (agregação) como parâmetro, já que os objetos são passados por referência.
Exemplo:

public class Teste {
private String erro;

public Teste() {}

public void alterarErro( Teste obj ) {
obj.erro = “Alterei”;
}

public void mostrarErro() {
Teste teste = new Teste();
teste.erro = “Não alterado”;
this.alterarErro( teste );
System.out.println( teste.erro );
}

public static void main( String args[] ) {
Teste teste = new Teste();
teste.mostrarErro();
}
}

Mas dessa maneira, eu precisei utilizar um atributo (variável global). Eu queria ter uma variável local no método mostrarErro, passa-la como parâmetro para a classe alterarErro, e modificar o conteúdo desse parâmetro, fazendo com que a variável local do método mostrarErro, sofresse as mesmas alterações que o parâmetro sofreu. Há alguma maneira de fazer isso? (talvez aproveitando a agregação disponível em java)

Fala pessoal…

 JavaTeco, desculpe ir contra sua opinião, mas discordo que em Java não exista passagem por referência..
 Aprendí que em Java, existe a passagem por referência quando passamos [b]OBJETOS[/b] como parâmetros, e existe a passagem por valor quando passamos [b]TIPOS PRIMITIVOS[/b] como parâmetros. Fikei ateh meio em dúvida quando ví seu post, e resolví testar. Segue abaixo os códigos:
public class A {
	public static void main(String[] args) {
		B b = new B();
		System.out.println(b.valor);
		C.mudaValor(b);
		System.out.println(b.valor);
                                // Saída produzida: 2 e 15
                                // Provado a existência de passagem por referência.
	}
}

class B {
	int valor;
	B() { valor = 2; }
}

class C {
	public static void mudaValor(B objeto) {
		objeto.valor = 15;
	}
}
public class A {
	public static void main(String[] args) {
		int valor = 2;
		System.out.println(valor);
		C.mudaValor(valor);
		System.out.println(valor);
                                // Saída produzida: 2 e 2
                                // Provado passagem por valor pra tipos primitivos.
	}
}

class C {
	public static void mudaValor(int valor) {
		valor = 15;
	}
}

silenthell,

 vc deve está encontrando problemas e se confundindo com a passagem por referência pq estás passando um String como parâmetro.

A implementação da classe String que não permite que vc altere-o uma referência passada em parâmetro…

JoaoPaulo, bem… o JavaTeco esta certo cara… ehheheh… ae, da uma olhada nesse tópico, q trata exatamente disso, questão certa no exame! :smiley:

http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=3845

Você pode passar um array de uma posição (solução porca) com o valor a ser alterado. (ai é por referência pois array são objetos).

Ou use uma Classe Wrapper (Integer, Float, Double, etc…)

O que seria a classe Wrapper?

Matheus,

pelo que entendi do exemplo que vc deu na postagem, o objeto está sendo passado sim por referência. Veja só. Qdo vc chama o método foo vc cria um objeto o e fala que ele é uma referência para o carinha que vc está chamando. Tanto é q se vc fizer o.setNome(“segundo objeto”) ao invés de o = new Objeto(“seg obj”), qdo a função retornar a saída será:
primeiro objeto
segundo objeto
Isso é passagem por referência, não tem nada de valor aí.

No seu caso, qdo vc faz o = new Objeto(“seg obj”) vc simplesmente disse q o Objeto o não está mais “apontando” para o carinha q foi passado como parâmetro, e sim para um novo objeto. Então nem tinha q imprimir segundo objeto mesmo, tá certo, passagem por referência da mesma forma.

Só pra lembrar, o método foo é:

private static void foo( Objeto o )
{
o = new Objeto(“segundo objeto”);
}

Segue o começo do texto do Apendice A do livro Thinking in Java, 4ª edição. Tem na net, de graça…

A: Passing & Returning Objects
By now you should be reasonably comfortable with the idea that when you?re ?passing? an object, you?re actually passing a reference.

In many programming languages you can use that language?s ?regular? way to pass objects around, and most of the time everything works fine. But it always seems that there comes a point at which you must do something irregular, and suddenly things get a bit more complicated (or in the case of C++, quite complicated). Java is no exception, and it?s important that you understand exactly what?s happening as you pass objects around and manipulate them. This appendix will provide that insight. Feedback

Another way to pose the question of this appendix, if you?re coming from a programming language so equipped, is ?Does Java have pointers?? Some have claimed that pointers are hard and dangerous and therefore bad, and since Java is all goodness and light and will lift your earthly programming burdens, it cannot possibly contain such things. However, it?s more accurate to say that Java has pointers; indeed, every object identifier in Java (except for primitives) is one of these pointers, but their use is restricted and guarded not only by the compiler but by the run-time system. Or to put it another way, Java has pointers, but no pointer arithmetic. These are what I?ve been calling ?references,? and you can think of them as ?safety pointers,? not unlike the safety scissors of elementary school?they aren?t sharp, so you cannot hurt yourself without great effort, but they can sometimes be slow and tedious. Feedback

silenthell,

classes Wrapper são classes que encapsulam os tipos primitivos, por exemplo, para encapsular int existe uma classe Integer, para encapsular double exite Double, long existe Long e assim por diante.

Fala moçada…

carisio, tirou as palavras da minha boca veio :smiley:

teve uma dia que eu tava dando aula e essa dúvida aí apareceu entre os alunos. A sorte é que a leitura que eu tinha feito no Thinking in Java, permitiu que eu desse o embasamento correto a meus alunos.

aliás… para os iniciantes que não tem problemas com inglês, considero o Thinking in Java o melhor livro de Java.

[quote=“Samuel_Pessorrusso”]Você pode passar um array de uma posição (solução porca) com o valor a ser alterado. (ai é por referência pois array são objetos).

Ou use uma Classe Wrapper (Integer, Float, Double, etc…)[/quote]

:roll:

Não existe passagem por referência em Java (em nenhuma maneira)… nem quando se trata de objetos.

O que acontece é que quando vc passa o objeto, vc está passando POR VALOR a referência ao objeto, mas os seus atributos não…

Faça o seguinte teste para vc confirmar o que eu estou dissendo: Crie um programa de passe como parâmetro um objeto, depois dentro deste método faça o objeto receber null, depois de executar o método verifique se o objeto está null. Com certeza não estará…

Blz???

:wink:

JavaTeco, eu sei disso, só fui didatico.
toda passagem é por valor, lógico e se vc passa por valor a referencia de um objeto, e altera-lo sem alterar a referencia, tudo bem… pois você estará alterando os dados em memória que a referência “referencia” e não a referência em si.

Desculpe… mas as vezes dar os nomes certos aos “bois” não causa confusão…
Mais entendi o que vc quis fazer… e com certeza pra pessoa que não sabe fica facil.

Blz??? :wink: