Passagem por valor

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

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.

[quote=“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.

[code]

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

}

[/code][/quote]

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

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

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

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