Dúvida sobre esse código!

Os valores não estão sendo passados para os métodos :frowning:
Quando eu imprimo, o valor retorna todo 0.0

[code]import java.text.NumberFormat;
//import java.text.NumberFormat;
import javax.swing.*;
public class Ex02 {

public void lerNumeros (int num, int num2) {
 
    try {
    num = Integer.parseInt(JOptionPane.showInputDialog("1° Número: "));
    num2 = Integer.parseInt(JOptionPane.showInputDialog("2° Número: "));
  }
    catch (NumberFormatException e) {
    JOptionPane.showMessageDialog(null, "Apenas números inteiros nesse campo: ");  
    
 }

}

public void Somar (int num, int num2) {
 
    float soma = num + num2;
    JOptionPane.showMessageDialog(null, "Soma: " + soma);
    
}
public void Subtrair (int num, int num2) {
 
    float sub = num - num2;
    JOptionPane.showMessageDialog(null, "Subtração: " + sub);
    
}
public void Multiplicar (int num, int num2) {
 
    float mult = num * num2;
    JOptionPane.showMessageDialog(null, "Multiplicação: " + mult);
    
}
public void Divisao (int num, int num2) {
 
    float div = num / num2;
    JOptionPane.showMessageDialog(null, "Divisão: " + div);
    
}

public static void main (String args[]) {
        int num = 0;
        int num2 = 0;
        Ex02 ex = new Ex02();
        ex.lerNumeros(num, num2);
        ex.Somar(num, num2);
        ex.Subtrair(num, num2);
        ex.Multiplicar(num, num2);
        ex.Divisao(num, num2);
}     

}[/code]

Seu problema acontece porque em Java não existe passagem de parâmetro por referência.

[code] public static void main(String[] args) throws Exception{
Integer num = 10;
System.out.println("Antes do método: "+num);
metodo(num);
System.out.println("Depois do método: "+num);
}

private static void metodo(Integer num){
	System.out.println("Dentro do método: "+num);
	num = Integer.valueOf(300);
	System.out.println("Depois da atribuição: "+num);
}[/code] Veja o que é impresso na execução desse código.

Quando você envia um parâmetro para um método, apenas uma cópia do valor dele é enviado.

Se envia um tipo primitivo, é enviada uma cópia do valor, e não a própria variável.
Se envia um objeto, é enviada uma cópia da referência, e não a referência que você tem ao invocar o método.

Você pode fazer o seu ‘lerNumero’ retornar um número

public void lerNumero () {
     int n = -1;
      try {
        n = Integer.parseInt(JOptionPane.showInputDialog("1° Número: "));
      }
        catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(null, "Apenas números inteiros nesse campo: ");  
     }
     return n;
  }

Ou guardar os números dentro da classe

[quote=digaoneves]Seu problema acontece porque em Java não existe passagem de parâmetro por referência.

[code] public static void main(String[] args) throws Exception{
Integer num = 10;
System.out.println("Antes do método: "+num);
metodo(num);
System.out.println("Depois do método: "+num);
}

private static void metodo(Integer num){
	System.out.println("Dentro do método: "+num);
	num = Integer.valueOf(300);
	System.out.println("Depois da atribuição: "+num);
}[/code] Veja o que é impresso na execução desse código.

Obrigado pela resposta, mas eu não entendo essa sintaxe que você usou…
Throws Exception…
Integer.ValueOff…

Eu não sei o que isso faz, fica difícil entender :slight_smile:
Obrigado!

[quote=magostta]Você pode fazer o seu ‘lerNumero’ retornar um número

public void lerNumero () {
     int n = -1;
      try {
        n = Integer.parseInt(JOptionPane.showInputDialog("1° Número: "));
      }
        catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(null, "Apenas números inteiros nesse campo: ");  
     }
     return n;
  }

Ou guardar os números dentro da classe[/quote]

Cara, eu não sei usar o return.

consultou o javadoc dos métodos que não entendeu?

bom, os dois são irrelevantes para o problema.[code] public static void main(String[] args){
Integer num = 10;
System.out.println("Antes do método: "+num);
metodo(num);
System.out.println("Depois do método: "+num);
}

private static void metodo(Integer num){
	System.out.println("Dentro do método: "+num);
	num = 300;
	System.out.println("Depois da atribuição: "+num);
}[/code] Melhor?

o return funciona assim:

voce tem um método

[code]int somaNumeros(int a, int b){

int c = a+b;

return c;

}[/code]

veja que la em cima eu coloquei um int antes do nome do método, aquilo é o tipo de dados que vou retornar…

veja que declarei uma variavel do tipo int, e somei os numeros passados por parâmetro, depois retornei o resultado

quando você fizer assim

int algumaVariavel = somaNumeros(5,10);

você tem que ler mentalmente dessa forma: " a variavel irá receber o valor que o método somaNumeros esta retornando, no caso o método tem la “return c” que é a soma dos dois numeros que foram passados por parâmetro.

então abaixo, quando você fizer:

system.out.println(algumaVariavel), ele vai imprimir 15.

no caso usei int, mais você pode usar qualquer tipo… como string(texto),double,float, objetos que você mesmo cria etc…

o return deve retornar o mesmo tipo que você colocou na assinatura do método…

espero que tenha compreendido

Eu acho que a confusão dele é por outro motivo…[code]public static void main(String[] args){

Pessoa p = new Pessoa():
p.setNome("Beto");
System.out.println(p.getNome());
alterarNome(p);
System.out.println(p.getNome());

}

public static void alterarNome(Pessoa p){

p.setNome("Zé");

}[/code]Esse código funcionaria como ele quer, o objeto seria alterado dentro do método, e o objeto depois da finalização da execução do método, teria o seu nome alterado, mas no caso dele isso não funciona, justamente porque não existe passagem de parâmetros por referência em Java.