Passagem por valor

5 respostas
cu_ringa

No codigo abaixo, q chamo o metodo soma passo o valor de x como parametro e uma copia de x é gerada por isso q mando imprimir x pela segunda vez o valor nao e alterado. Agora minha duvida vem aqui, q chamo o metodo componente passo um JButton e um JPanel como parametro, ou seja, tambem uma copia de cada variavel e criada já q a passagem e por valor(pelo q eu sei), sendo assim q o metodo add for chamado passando panel como argumento não era para anexar nada a JFrame já que o botao foi adcionado a uma cópia do JPanel§ e nao ao JPanel original(panel). Mas nao e o q acontece, o botao e adcionado ao panel original e esse ao JFrame.

Pq isso está acontecendo? Essa é uma duvida crue q estou martelando.

import javax.swing.*;
import java.awt.*;

public class Escopo extends JFrame{
	
	int x = 3;
	JButton b1;
	
	public Escopo(){
		
		b1 = new JButton("carlos");;
		JPanel panel = new JPanel();
		
		componente(b1, panel);
		
		System.out.println(x);
		soma(x);
		System.out.println(x);
		
		getContentPane().setLayout(new FlowLayout());
		
		add(panel);
		
		setSize(250, 250);
		setVisible(true);
		
	}
	
	public void componente(JComponent b, JComponent p){
		
		p.add(b);
	}
	
	public void soma(int x){
		
		x = x + x;
	}
	public static void main(String args[]){
		
		new Escopo();
	}	
}

5 Respostas

vamorim

Em Java todos os parâmetros são passados por valor. Assim, quando se passa um tipo primitivo, é feita uma cópia do seu valor de tal forma que a variável passada permaneça inalterada. Bom, isso é passagem por valor.

Você nunca passa um objeto como valor. Você passa uma variável de referência. Passar uma variável de referência significa fazer o parâmetro referenciar a mesma coisa que a variável de referência referencia. Ou seja, quando você faz isso:

conjunto.add(pessoa);

se pessoa for null, o valor null será passado para o método. Senão, o parâmetro referenciará ao mesmo objeto referenciado por pessoa. Note que não é criada uma cópia do objeto. Note também que o método pode alterar o objeto referenciado, simulando uma passagem por referência.

fel_augusto
"cu_ringa":
No codigo abaixo, q chamo o metodo soma passo o valor de x como parametro e uma copia de x é gerada por isso q mando imprimir x pela segunda vez o valor nao e alterado. Agora minha duvida vem aqui, q chamo o metodo componente passo um JButton e um JPanel como parametro, ou seja, tambem uma copia de cada variavel e criada já q a passagem e por valor(pelo q eu sei), sendo assim q o metodo add for chamado passando panel como argumento não era para anexar nada a JFrame já que o botao foi adcionado a uma cópia do JPanel(p) e nao ao JPanel original(panel). Mas nao e o q acontece, o botao e adcionado ao panel original e esse ao JFrame.

Pq isso está acontecendo? Essa é uma duvida crue q estou martelando.

import javax.swing.*;
import java.awt.*;

public class Escopo extends JFrame{
	
	int x = 3;
	JButton b1;
	
	public Escopo(){
		
		b1 = new JButton("carlos");;
		JPanel panel = new JPanel();
		
		componente(b1, panel);
		
		System.out.println(x);
		soma(x);
		System.out.println(x);
		
		getContentPane().setLayout(new FlowLayout());
		
		add(panel);
		
		setSize(250, 250);
		setVisible(true);
		
	}
	
	public void componente(JComponent b, JComponent p){
		
		p.add(b);
	}
	
	public void soma(int x){
		
		x = x + x;
	}
	public static void main(String args[]){
		
		new Escopo();
	}	
}

karinha...... ñ sei ñ mas acho q no seu código os "x" estão se confundindo. Pq vc ñ tenta colocar o parâmetro do método "soma" como "int y" e dentro do método vc coloca "y=x; x=x+x;" e ve se da certo. Se ñ der vc me responde. blz. falou karinha ........ fui

cu_ringa

valeu vamorim.
q dizer q objeto sempre e passado por referencia.

vamorim

Ná prática, é como se fosse. :wink:

TedLoprao

Só é importante lembrar que se vc der um new dentro do método e alterar a referência, o objeto de fora não sofrerá nenhuma alteração, veja o ex.:

// método qualquer
Pessoa p = new Pessoa();
p.setNome("TedLoprao");
trocaNome(p);
System.out.println(p.getNome());


public void trocaNome(Pessoa p) {
   p = new Pessoa();
   p.setNome("Rodrigo");
}

O nome impresso ainda será TedLoprao…

Fallow

Criado 13 de junho de 2004
Ultima resposta 14 de jun. de 2004
Respostas 5
Participantes 4