Métodos – teoría

Un método es un grupo de sentencias que realizan una operación o tarea específica. En la resolución de problemas tanto por métodos estructurados como por métodos orientados a objetos, se recurre a un proceso de refinamiento sucesivo que implica la descomposición de un problema o proceso, en subproblemas o subprocesos más pequeños y de menor complejidad.

Los métodos se utilizan para capturar y representar los procesos y subprocesos. El programa principal (main) de Java es una secuencia de llamadas a métodos que pueden llamar a otros métodos.

Definición de un método (método definido por el usuario)

Un método se representa por un nombre o identificador y un conjunto de tipos de operandos, denominados parámetros que se escriben encerrados entre paréntesis separados por comas. Las sentencias que debe ejecutar el método se especifica en un bloque, conocido como cuerpo del método. Cada método tiene un tipo de valor de retorno asociado.

Sintaxis

      tipo_de_valor_de_retorno nombre_método (lista_parámetros)
      {
                Sentencias 
      }

Donde:

  • tipo_de_valor_de_retorno: Indica el tipo de valor que se devuelve al método invocador. Si un método no devuelve ningún valor, se utiliza el tipo void, que se considera como un tipo de dato especial.
  • nombre_método: Es cualquier identificador válido.
  • lista_parámetros: Es una lista separada por comas que contiene un conjunto de tipos de operandos que se pasarán al método. Si un método no recibe parámetros la lista_parámetros se deja vacía.

Para que el compilador pueda compilar una llamada a un método primero debe conocer la declaración de ese método. Las declaraciones de los métodos normalmente aparecen antes del método main() en un programa.

Ejemplo

En el siguiente ejemplo utilizamos la palabra reservada static para llamar al método desde el método main que es estático. El método mcd (máximo común divisor de dos números).

      public static int mcd(int a, int b){                                    // método llamado
              int divisor=2,producto=1;
              while(divisor<=a && divisor<=b)
                      if(a%divisor==0 && b%divisor==0)
                      {
                            producto = producto*divisor;
                            a = a/divisor;
                            b = b/divisor;
                      }
                      else
                               divisor++;
              return producto;
      }

Para llamar a un método se utiliza el operador de llamada que es el nombre del método con una lista de parámetros, solos los nombres.

      public static void main(String[] args) {                          // método llamador
               Scanner entrada = new Scanner(System.in);
               int x, y, mcd;
               do{
                         System.out.print(«Ingresar primer numero: «);
                         x = entrada.nextInt();
                         System.out.print(«Ingresar segundo numero: «);
                         y = entrada.nextInt();
               }while(x<0 && y<0);
               mcd = mcd(x,y);
               System.out.println(«El maximo comun divisor de «+x+» y «+y+» «
                                                                                                     + «es: » + mcd);
      }

La llamada de un método realiza dos cosas: inicializa los parámetros del método a partir de los parámetros correspondientes y transfiere el control al método invocado. La ejecución del método llamador se detiene y comienza la ejecución del método llamado. La ejecución del método comienza con la definición e inicialización de sus parámetros. En el caso de mcd, se crean las variables de tipo entero x e y, y se inicializa con los valores introducidos por la entrada System.out.print(). A continuación, se ejecuta el bloque del bucle y termina cuando se encuentra una sentencia return que produce el resultado especificado en el. Después de ejecutar return, el método llamador reanuda su ejecución en el punto de llamada.

El tipo de valor de retorno de un método puede ser un tipo incorporado, como int o double, un tipo clase, o un tipo compuesto como String. También puede ser void el tipo de valor de retorno, en cuyo caso significa que no se devuelve ningún valor.

La sentencia return

La sentencia return termina el método que se está ejecutando actualmente y devuelve el control al método que la llamó.

Sintaxis

      return expresión;

Una sentencia return con expresión proporciona el resultado del método. Cada retorno de un método con un tipo distinto de void debe devolver un valor. El valor devuelto debe tener el mismo tipo que el tipo de valor de retorno del método, o debe tener un tipo que pueda ser convertido implícitamente a este tipo.

Ejemplo

Calcular el importe total de un conjunto de artículos de un supermercado, cada precio ha de ser incrementado con las tasas de impuestos (IGV).

      public static double calcularPrecioTotal(int numero, double precio){
              final double IGV = 0.16;                 // 16% de impuesto
              double subTotal;
              subTotal = precio*numero;
              return (subTotal+subTotal*IGV);
      }

Precaución

Es recomendable el uso de return ya que ayuda a recordar el retorno en ese punto al método llamador.

Un error típico de programación es olvidar incluir la sentencia return o situarla dentro de un bloque de código o sentencias que no se realice. Si ninguna sentencia return se ejecuta, entonces el resultado que devuelve el método es impredecible y puede originar que su programa falle o produzca resultados incorrectos. Por ejemplo, suponga que se sitúa la sentencia return dentro de un bloque de código que se ejecuta condicionalmente como:

      if(Total>=0.0)
         return Total;

Si Total es menor que cero, no se ejecuta la sentencia return y el resultado del método es un valor aleatorio.

Métodos static, campos static y la clase Math

Toda clase proporciona métodos que realizan tareas comunes en objetos de esa clase. Por ejemplo, para introducir datos mediante el teclado, hemos llamado métodos en un objeto Scanner que se inicializó en su constructor para obtener la entrada del flujo de entrada estándar (System.in).  Aunque la mayoría de los métodos se ejecutan en respuesta a las llamadas a métodos en objetos específicos, éste no es siempre el caso. Algunas veces un método realiza una tarea que no depende del contenido de ningún objeto. Dicho método se aplica a la clase en la que está declarado como un todo, y se conoce como método static o método de clase. Es común que las clases contengan métodos static convenientes para realizar tareas comunes. Por ejemplo cuando utilizamos la clase Math para elevar un valor a una potencia. Para declarar un método como static, coloque la palabra clave static antes del tipo de valor de retorno en la declaración del método.

Sintaxis

      static tipo_de_valor_de_retorno nombre_método (lista_parámetros)
      {
                Sentencias 
      }

Puede llamar a cualquier método static especificando el nombre de la clase en la que está declarado el método, seguido de un punto (.) y del nombre del método.

Sintaxis

       NombreClase.nombreMétodo(argumentos)

Aquí utilizaremos varios métodos de la clase Math para presentar el concepto de los métodos static. La clase Math cuenta con una colección de métodos que nos permiten realizar cálculos matemáticos comunes. (Ver Funciones matemáticas)

Ejemplo

Calcular la raíz cuadrada de 900.0, con una llamada al siguiente método static.

       Math.sqrt(900.0)

La expresión anterior se evalúa como 30.0. El método sqrt recibe un argumento de tipo double y devuelve un resultado del mismo tipo. Para reportar el valor de llamada anterior al método en una ventana de consola, podríamos escribir la siguiente instrucción:

       System.out.println(Math.sqrt(900.0));

En esta expresión, el valor que devuelve sqrt se convierte en el argumento para el método println. Observe que no hubo necesidad de crear un objeto Math antes de llamar al método sqrt. Observe también que todos los métodos de la clase Math son static; por lo tanto, cada uno se llama anteponiendo al nombre del método el nombre de la clase Math y el separador punto (.).

¿Por qué el método main se declara como static?

¿Por qué el main debe declararse como static? Cuando se ejecuta la Máquina Virtual de Java (JVM) con el comando java, la JVM trata de invocar al método main de la clase que usted le específica; cuando no se han creado objetos de esa clase. Al declarar main como static, la JVM puede invocar a main sin tener que crear una instancia de la clase.

Sintaxis

       public static void main(String [] args){

       }