Passagem de Argumentos

Oi pessoal, estou agora a começar a estudar Java e encontrei umas duvidas
ja agora sou português espero que isso não vos atrapalhe na leitura.

A minha dúvida é:
Tenho este código e não sei como é que tenho de completar para que ele funcione, já tentei tudo
e fica sempre lá um erro =/ alguém me pode ajudar? porque eu já estou farto de ler ler ler e não encontro nada que me ajude pois o erro continua sempre lá.

static void troca1(int x, int y) {
  int aux = x; x = y; y = aux;
}

static void troca2(int[] a, int i, int j) {
  int aux = a[i]; a[i] = a[j]; a[j] = aux;
}

class Inteiro {
  public int valor;
}

static void troca3(Inteiro u, Inteiro v) {
  Inteiro aux = u; u = v; v = aux;
}

static void troca4(Inteiro u, Inteiro v) {
  int aux = u.valor; u.valor = v.valor; v.valor = aux;
}

...

int x = 0, y = 2;
troca1(x,y);

int[] a = { 2, 3 };
troca2(a,0,1);

Inteiro u = new Inteiro(); u.valor = 5;
Inteiro v = new Inteiro(); v.valor = 7;
troca3(u,v);
troca4(u,v);

...

e depois no fim do codigo tem o exercicio:

Indique, justificando, o valor das variáveis:

x e y após a chamada troca1(x,y),
a[0] e a[1] após a chamada troca2(a,0,1),
u.valor e v.valor após a chamada troca3(u,v),
u.valor e v.valor após a chamada troca4(u,v).

Outra duvida é, será que a 3 e 4 sao iguais? nao estou a perceber =/

Obrigado

Mas qual o erro que está acontecendo (o console indica algum erro de compilação? Qual?)

o codigo está incompleto, e quando eu tento completar para ver o que dá nas saidas não fica bem feito.
o meu problema é que não percebo a organização dos métodos e das classes =/

alguém pode completar o programa de modo a ficar operacional para eu ver se consigo perceber o exercício?

Obrigado

Você não está conseguindo fazer com que o programa fique funcional?

Acho que entendi. Você deve colocar todos os métodos dentro da classe, e colocar os comandos de execução e criação de objetos que estão entre os “…” dentro do método main. Fica algo assim:

class Inteiro {  
	public int valor;  

	static void troca1(int x, int y) {
		int aux = x; x = y; y = aux;
	}

	static void troca2(int[] a, int i, int j) {
		int aux = a[i]; a[i] = a[j]; a[j] = aux;
	}

	static void troca3(Inteiro u, Inteiro v) {
		Inteiro aux = u; u = v; v = aux;
	}

	static void troca4(Inteiro u, Inteiro v) {
		int aux = u.valor; u.valor = v.valor; v.valor = aux;
	}

	public static void main(String[] args) {
		int x = 0, y = 2;
		troca1(x,y);

		int[] a = { 2, 3 };
		troca2(a[0],a[1]);

		Inteiro u = new Inteiro(); u.valor = 5;
		Inteiro v = new Inteiro(); v.valor = 7;
		troca3(u,v);
		troca4(u,v);

                System.out.println(x);
                System.out.println(y);
                System.out.println(u);
                System.out.println(v);
                System.out.println(u.valor);
                System.out.println(v.valor);

	}

}  

A classe chama-se “Inteiro”.

Existe uma variável de instância chamada “valor” (do tipo inteiro).

Existem 4 métodos que não retornam nada (tipo “void”). São eles: “trocaN”, onde N assume valores de 1 a 4.

Existe o método principal (“main”), que é estático (“static”) e não retorna nenhum valor (“void”) e recebe os parâmetros “String[] args” (um vetor de Strings chamado “args”). É nele que todos os comandos principais ficam.

No caso, criamos dois inteiros “x” e “y” e chamamos o método “troca1”, passando esses valores. Logo, o fluxo do programa é desviado para o corpo do bloco “troca1”, executando todos os comandos lá presentes.

Em seguida, criamos um vetor de inteiros, com os valores 2 e 3. Chamamos o método troca2. Ocorre algo similar ao que foi descrito acima.

Por fim, criamos dois objetos “u” e “v”. Mudamos seus valores para 5 e 7, respectivamente. Chamamos os métodos troca3 e troca4.

Por último, mostramos os valores de todas as variáveis e objetos.

Verifique a saída para entender melhor.

Abraços.

Primeiro que tudo obrigado marco pela ajuda que tas a dar =)
Já percebi qual era o meu erro.

Agora fui fazer prints das variaveis pedidas para comparar com aquilo que eu pensei e deume isto:

[code]
class Inteiro {
public int valor;

static void troca1(int x, int y) {   
    int aux = x; x = y; y = aux;   
}   

static void troca2(int[] a, int i, int j) {   
    int aux = a[i]; a[i] = a[j]; a[j] = aux;   
}   

static void troca3(Inteiro u, Inteiro v) {   
    Inteiro aux = u; u = v; v = aux;   
}   

static void troca4(Inteiro u, Inteiro v) {   
    int aux = u.valor; u.valor = v.valor; v.valor = aux;   
}   

public static void main(String[] args) {   
    int x = 0, y = 2;   
    troca1(x,y);   
    System.out.println(x);
    System.out.println(x);

    int[] a = { 2, 3 };   
    troca2(a,0,1);   
    System.out.println(a[0]);
    System.out.println(a[1]);
    
    Inteiro u = new Inteiro(); u.valor = 5;   
    Inteiro v = new Inteiro(); v.valor = 7;   
    troca3(u,v);  
    System.out.println(u);
    System.out.println(v);
    troca4(u,v);   
    System.out.println(u.valor);
    System.out.println(v.valor);
}   

} [/code]

0
0
3
2
Inteiro@3e25a5
Inteiro@19821f
7
5

O a[0] e o a[1] eu percebi, o u.valor e y.valor também, mas não estou a perceber porque o x e o y dão ambos 0 e porque os valores de u e v aparecem com aquele código.

Se me puder ajudar mais eu agradeço. =)
tem sido uma óptima ajuda =)

Já percebi os valores de X e de Y era fácil mas estava a pensar mal.

Quanto aos valores estranhos fui eu que me enganei e devia ser print de u.valor e v.valor obviamente. ficaria entao assim:

troca3(u,v); System.out.println(u.valor); System.out.println(v.valor); troca4(u,v); System.out.println(u.valor); System.out.println(v.valor);
O que dá:

5
7
7
5

A minha pergunta é, porque é que isso acontece?
e qual a diferença entre troca3 e troca4.

Assim já fico a perceber os métodos. Esta complicado entrar nisto =S

troca1 não vai funcionar pois em java não há passagem de parâmetro por referencia, somente por cópia.

Isso significa que a troca feita dentro dos métodos usa variáveis locais, não aquelas.

Quanto ao o que acontece depois de troca3 e troca4: Você está trocando os valores, depois os troca de volta.

Desculpe Bruno mas funcionam as 4 trocas =/
a unica questão é eu não estar a entender o que acontece dentro da troca3 e troca4
a troca1 nao percebo porque diz que nao funciona pois essa percebi facilmente que iria dar.

public class Inteiro {

    public int valor;

    @Override
    public String toString() {
        return super.toString() + ".valor = " + String.valueOf(valor);
    }

    static void troca1(int x, int y) {
        System.out.printf("troca1 inicio: x = %d, y = %d\n", x, y);
        int aux = x; x = y; y = aux;
        System.out.printf("troca1 fim   : x = %d, y = %d\n", x, y);
    }

    static void troca2(int[] a, int i, int j) {
        System.out.printf("troca2 inicio: a[%d] = %d, a[%d] = %d\n", i, a[i], j, a[j]);
        int aux = a[i]; a[i] = a[j]; a[j] = aux;
        System.out.printf("troca2 fim   : a[%d] = %d, a[%d] = %d\n", i, a[i], j, a[j]);
    }

    static void troca3(Inteiro u, Inteiro v) {
        System.out.printf("troca3 inicio: u = %s, v = %s\n", u, v);
        Inteiro aux = u; u = v; v = aux;
        System.out.printf("troca3 fim   : u = %s, v = %s\n", u, v);
    }

    static void troca4(Inteiro u, Inteiro v) {
        System.out.printf("troca4 inicio: u = %d, v = %d\n", u.valor, v.valor);
        int aux = u.valor; u.valor = v.valor; v.valor = aux;
        System.out.printf("troca4 fim   : u = %d, v = %d\n", u.valor, v.valor);
    }

    public static void main(String[] args) {
        int x = 0, y = 1;

        System.out.printf("antes de 1   : x = %d, y = %d\n", x, y);
        troca1(x,y);
        System.out.printf("depois de 1  : x = %d, y = %d\n", x, y);

        int[] a = { 2, 3 };
        System.out.printf("antes de 2   : a[0] = %d, a[1] = %d\n", a[0], a[1]);
        troca2(a,0,1);
        System.out.printf("depois de 2  : a[0] = %d, a[1] = %d\n", a[0], a[1]);

        Inteiro u = new Inteiro(); u.valor = 4;
        Inteiro v = new Inteiro(); v.valor = 5;
        System.out.printf("antes de 3   : u = %s, v = %s\n", u, v);
        troca3(u,v);
        System.out.printf("depois de 3  : u = %s, v = %s\n", u, v);

        u = new Inteiro(); u.valor = 6;
        v = new Inteiro(); v.valor = 7;
        System.out.printf("antes de 4   : u = %d, v = %d\n", u.valor, v.valor);
        troca4(u,v);
        System.out.printf("depois de 4  : u = %d, v = %d\n", u.valor, v.valor);
    }
}

Corrigindo o que disse antes, somente troca2 e troca4 vão funcionar.

antes de 1   : x = 0, y = 1
troca1 inicio: x = 0, y = 1
troca1 fim   : x = 1, y = 0
depois de 1  : x = 0, y = 1
antes de 2   : a[0] = 2, a[1] = 3
troca2 inicio: a[0] = 2, a[1] = 3
troca2 fim   : a[0] = 3, a[1] = 2
depois de 2  : a[0] = 3, a[1] = 2
antes de 3   : u = Inteiro@1b67f74.valor = 4, v = Inteiro@69b332.valor = 5
troca3 inicio: u = Inteiro@1b67f74.valor = 4, v = Inteiro@69b332.valor = 5
troca3 fim   : u = Inteiro@69b332.valor = 5, v = Inteiro@1b67f74.valor = 4
depois de 3  : u = Inteiro@1b67f74.valor = 4, v = Inteiro@69b332.valor = 5
antes de 4   : u = 6, v = 7
troca4 inicio: u = 6, v = 7
troca4 fim   : u = 7, v = 6
depois de 4  : u = 7, v = 6

Lembre-se que os valores nos parâmetros são variáveis locais, cópias das passadas. Mudanças nelas não afetarão as variáveis no método que as chamou. Mudanças no interior delas porém, afetam, como é o caso de troca 2 e 4.

Uma explicação mais simples pode ser:

A diferença entre troca3 e troca4 é:

troca4 inverte os números contidos na variável “valor” de cada objeto. Já o troca3, inverte a referência aos objetos. É importante considerar que objetos NÃO são armazenados em variáveis. Eles são criados pela palavra chave new e alocados em algum lugar qualquer da memória. O que fica armazenado na variável é a referência àquele objeto (no caso aqueles códigos hexadecimais estranhos). Mas é exatamente aquilo que deveria acontecer, pois os nomes de variáveis “u” e “v”, somente apontam para os objetos na memória.

Os valores imprimidos estão sendo:

0
0

Por que está imprimindo “x” duas vezes. O correto é uma vez o “x” e outra o “y”. Altere no seu código.

Bruno não está a perceber a ideia. eu sei que eles não se alteramm depois, o que interessa é no fim de cada método mas ainda dentro dele.
O resultado que meteu é exactamente o que mostra o exercicio e funciona tudo como deveria estar.

Quanto à explicação do marco, obrigado, vou tentar perceber melhor pois estou um pouco confuso nas definições de objectos métodos e classes.
Quanto ou output fui eu que me enganei, seria X e Y obviamente.

Resta-me agora estudar o que foi aqui dito, Obrigado.

Sugestões de estudo:

Modelo de execução de seu programa: http://cid-e447172486d80781.skydrive.live.com/self.aspx/P%c3%bablico/execucao.pdf

Apostila Caelum FJ11 - Capítulos 4 em diante

Tutorial oficial Java - http://java.sun.com/docs/books/tutorial/java/concepts/index.html (em inglês).

Obrigado vou tentar estudar por ai.

só mais uma questão, no troca1 X e Y ficam com os valores adquiridos no main porque troca1 é static certo? porque é que no troca2 as posições da array ficam como estão no troca2 e não com os valores do main? por ser array?

Abraço

Entretanto o Bruno já tinha respondido a esta questão.
Agora tenho outra questão na página seguinte

Mais uma duvida, hehehe =P

Se na troca2 em vez de alterar os valores da array altera-se o comprimento da array, quando voltassemos ao main continuava altearada ou voltava ao inicial?
isso não é uma mudança interna portanto penso que voltava ao inicial.

Nem sei se isso é possivel =P

Se isso fosse possível, o comprimento do array seria alterado sim, inclusive quando voltássemos ao fluxo principal do programa.

O que é passado para o método quando se fornece um array como parâmetro é a posição da memória do dito cujo. Logo qualquer alteração nesse objeto será uma alteração no objeto original.

Porém isso não é possível: o comprimento de um vetor é uma característica inalterável.

Uma vez criado um array de N posições, tem-se esse array com as mesmas N posições até o fim de sua existência.

Queria só agradecer ao marco por isto :

Modelo de execução de seu programa: http://cid-e447172486d80781.skydrive.live.com/self...aspx/Público/execucao.pdf

porque ajudou-me muito e acho que fiquei a perceber bem =)