Alterar parametros passado na função

Pessoal é o seguinte me deparei com um novo problema

tem uma funcao que recebe alguns parametros e dentro dela eu chamo ela recursivamente incrementando dois parametros passado um int e o outro double só que ao final do processo as variaveis passada como parametro fica com o valor original delas Ex:

[color=green]
public void getMedia(NodoArvore x,int cont, double media)
{
if(x != null)
{
cont++;
media+= + x.chave;
getMedia(x.esq,cont,media);
getMedia(x.dir,cont,media);
}
}

chamo a funçao
int contador =0;
double contador = 0;

v.getMedia(v.raiz,contador,total);

[/color]

só que ao sai da função minha variavel contador = 0 e a total também. Tudo bem considero ser até certo isto pois os dois são tipos primitivos e não tipos de referências só que eu mudei o código para :shock: :

[color=green]

public void getMedia(NodoArvore x,Integer cont, Double media)
{
	if(x != null)
	{		
		cont=cont.intValue() + 1;
		media= media.doubleValue() + x.chave;
		getMedia(x.esq,cont,media);
		getMedia(x.dir,cont,media);
	}
}

chamo a funçao
Integer contador =0;
Double contador = 0.0;

v.getMedia(v.raiz,contador,total);

[/color]

Só que para a minha supresa também não funcionou ocorreu a mesma coisa do primeiro algoritimo. Gostaria de saber porque disto, será que o java ainda subentende que são tipos primitivos? :roll:

Para eu fazer o código funcionar tive quer fazer:

[color=green]

public void getMedia(NodoArvore x,double[] result)
{
	if(x != null)
	{		
		result[0]++;
		result[1]+= x.chave;
		getMedia(x.esq,result);
		getMedia(x.dir,result);
	}
}

chamo a funçao
double[] valor = new double[2];

v.getMedia(v.raiz,valor);

[/color]

Desde já grato. . .

a) A passagem de parâmetros no Java é sempre por valor (só que quando se trata de objetos, são as referências que são passadas por valor, já que o Java não faz cópia de objetos.)
b) java.lang.Integer é imutável (para seu código funcionar do jeito que você queria, teria de existir algo semelhante a “setIntValue” ou coisa parecida. Mas como java.lang.Integer é imutável, não existe tal método que altera o valor de um Integer.)
c) O jeito que você fez (passar um array de 1 elemento apenas) funciona, mas não é o mais adequado. Em vez disso, você poderia criar uma classe com 2 campos (cont e media), e retornar um objeto dessa classe. (Estou com preguiça de arranjar um nome decente para essa classe).

class Xyz {
    public int cont; 
    public double media;
    public Xyz (int pCont, double pMedia) { cont = pCont; media = pMedia; }
}
...
 public Xyz getMedia(NodoArvore x,Xyz xyz)
{
    if(x != null)
    {
        xyz.cont++;
        xyz.media += x.chave;
        Xyz m1 = getMedia(x.esq,xyz);
        Xyz m2 = getMedia(x.dir,m1);
        return m2;
    }
}

...
Xyz xyz = new Xyz (0, 0);
xyz = v.getMedia(v.raiz,contador,xyz); 
System.out.println (xyz.cont + "," + xyz.media);

Acho que assim funciona melhor
Integer contador =new Integer (0);
Double contador =new Double (0.0);

[quote=wolbert] Acho que assim funciona melhor
Integer contador =new Integer (0);
Double contador =new Double (0.0); [/quote]

Como já foi dito, os “wrappers” são imutáveis (não existe um método do tipo “setValue”.)

ele já testou isso?