Passagem de parametro retornando o valor modificado no método

Pessoal, eu estou um pouco perdid nas passagem de parametros entre os métodos e classes.

Exemplo, tenho duas váriaveis:

int pos = 0;
boolean flag = false;

Passo as variáveis, neste método:

BuscaPos(pos, flag);

Essa variáveis foram modificadas dentro de método BuscaPos(pos, flag), mas no retorno não ficam modifiacadas, ou seja, elas continuam com os valores da declaração.

O que acontece é que elas se modificam dentro do método BuscaPos(pos, flag); mas quando é retornado ao método onde o chamei, as variáeis continuam com o mesmo valor de antes de eu chamar o método, ou seja, com o valor declarado.

Espero ter explicado direito meu problema, obrigado e me ajudem.

É assim mesmo - os parâmetros são passados por valor, não por referência.

Se você precisa modificar apenas 1 parâmetro, em vez disso retorne esse tal parâmetro. Por exemplo:

int pos = 0;
bool flag = false;
pos = busca (pos, flag); 

Se você precisa modificar N parâmetros, crie uma classe bem simples, só para armazenar os parâmetros, e passe um objeto dessa classe.

class Parametros {
    public int pos;
    public boolean flag;
    public Parametros (int pos, boolean flag) { this.pos = pos; this.flag = flag; }
};

...
Parametros p = new Parametros (0, false);
busca (p); // modifique p.pos e p.flag dentro do método busca
System.out.println (p.pos);
System.out.println (p.flag);

Só vou dar uma pequena bronca aí em você - na maioria dos lugares em que se trabalha com Java, adota-se aquela convenção de começar nomes de métodos com minúsculas, nomes de classes com maiúsculas, e nomes de variáveis de instância com minúsculas. Se você se acostumar com essa convenção, você pode ganhar mais pontos em uma entrevista de emprego ou em um teste de admissão.
Então chame o método de “busca”, não “Busca”. OK?

O valor novo vc pega por return!!

mas se eu usar o return só vou conseguir retornar apenas um valor modificado.

eu quero retornar N valores modificados, armazenados nas varáveis é claro.

Retornar N valores modificados, armazenados nas variáveis é coisa que se faz em C e Delphi (usando “var”), e talvez em VB (é o default), mas não em Java (onde não se pode fazer isso). No C# esse também não é o padrão, mas é possível fazer “a contragosto” (ou seja, você tem de definir como “ref” e passar o parâmetro como “ref”.).

Para fazer isso em Java você tem de fazer isso que lhe indiquei (criar uma classe de “parâmetros”). Se você já olhou vários programas Java, vai ver que esse estilo é mais a exceção que a regra; normalmente você tenta usar a orientação a objetos em seu favor, em vez de atrapalhar você.

Não entendi muito bem, mas vou deixar um outro exemplo:

[code]public visualiza {
int pos = 0;
boolean flag = false;
// POS valse 0 e FLAG vale false;
buscaPos(pos, flag); //Método.
// POS valse 0 e FLAG vale false;
//depois que eu chamei o buscaPos();, as duas variáveis continuam com o mesmo valor.
//Gostaria que os valores delas fossem o mesmo que foi modificado dentro do método buscaPos();
//ou seja quero que pos fosse igual a 15 e flag igual a true.
}

public buscaPos(int pos, boolean flag) {

pos = 15;
flag = true;
// agora POS valse 15 e FLAG vale true;
}[/code]

Bom o thingol deu uma idéia com a classe Parametros, mas como vou declarar o objeto no buscaPos(?? p);
Não entendi mto bem, aqui ele da erro, quando passo um objeto por parametro.

Obrigado,

Uai, você declara como

public void busca (Parametros p) {
....
    p.pos = .....;
    p.flag = .....;
}

[quote=julianorusso]mas se eu usar o return só vou conseguir retornar apenas um valor modificado.

eu quero retornar N valores modificados, armazenados nas varáveis é claro.[/quote]

Bem, é pra isso que estruturas como os objetos servem.

PUXA OBRIGADOOOOOOO!!

Bom assim vou aprendendo.

Eu estou aprendendo também C#, mas ainda preciso do Visual Studio para começar as práticas.

Obrigado mesmo.

O que acontece é o seguinte:

Quando vc passa o parâmetro, você não está realmente passando a Referência de “pos” e “flag”, vc est[á passando a cópia do padrão de bits de ambas… ou seja, vc está passando os valores 0 e false… Aí vc diz, mas os meus parâmetros se chamam pos e flag tbm… blz, mas vc caiu num erro que eu tbm caia pra KCTi no início, você ocultou sua variável de instância e agora pos e flag tbm existem dentro do seu método como 2 variáveis (completamente diferente das 2 criadas na sua classe) que irão receber os novos valores… Logo, o que ocorre com suas variáveis de instância é que elas não são alteradas, lembre, você só passou uma cópia do padrão de bits delas para seus métodos e não a variável em si…

tem 2 opções aí… a primeira foi a que o Thingol deu, só que com um método para cada variável, e a segunda é…

tenta assim:

public class Visualiza {
    static int pos = 0;
    static boolean flag = false;

    public static void buscaPos() {
        this.pos = 15;
        this.flag = true;
    }

    public static void main(String[] args) {
        buscaPos();
        System.out.println("pos = " + pos + " flag = " + flag);
    }
}

1 - coloque um tipo de retorno na frente do seu método public buscaPos()… método sem tipo de retorno o compilador vai ler como se fosse um construtor de classe…

2 - coloque nome de classes com a primeira letra em Maiuscula…

3 - coloque o identificador class na frente do nome de uma classe…

Dê uma estudada na forma que o Thingol lhe passou, pois é assim que vc vai usar 99,99% das vezes…

Falows :wink:

Puxa, agora as coisas estão mais claras.

Obrigado.

Falowss aew galéra!!